|
526 | 526 | gback = xEmu; \ |
527 | 527 | gdoffset = offsetof(x64emu_t, xmm[gd]) |
528 | 528 |
|
529 | | -#define GETGY() \ |
530 | | - gd = ((nextop & 0x38) >> 3) + (rex.r << 3); \ |
531 | | - /* TODO: forget */ \ |
| 529 | +#define GETGY() \ |
| 530 | + gd = ((nextop & 0x38) >> 3) + (rex.r << 3); \ |
| 531 | + if (dyn->e.ssecache[gd].v != -1 && dyn->e.ssecache[gd].vector) \ |
| 532 | + avx_flush_upper_vector(dyn, ninst, x3, gd, dyn->e.ssecache[gd].reg, 0, 0); \ |
| 533 | + if (dyn->e.ymm0 & (1 << gd)) { \ |
| 534 | + SD(xZR, xEmu, offsetof(x64emu_t, ymm[gd]) + 0); \ |
| 535 | + SD(xZR, xEmu, offsetof(x64emu_t, ymm[gd]) + 8); \ |
| 536 | + sse_set_pending_zero(dyn, gd, 0); \ |
| 537 | + } \ |
532 | 538 | gyoffset = offsetof(x64emu_t, ymm[gd]) |
533 | 539 |
|
534 | 540 | #define GETVX() \ |
535 | 541 | sse_forget_reg(dyn, ninst, x3, vex.v); \ |
536 | 542 | vback = xEmu; \ |
537 | 543 | vxoffset = offsetof(x64emu_t, xmm[vex.v]) |
538 | 544 |
|
539 | | -#define GETVY() \ |
540 | | - /* TODO: forget */ \ |
| 545 | +#define GETVY() \ |
| 546 | + if (dyn->e.ssecache[vex.v].v != -1 && dyn->e.ssecache[vex.v].vector) \ |
| 547 | + avx_flush_upper_vector(dyn, ninst, x3, vex.v, dyn->e.ssecache[vex.v].reg, 0, 0); \ |
| 548 | + if (dyn->e.ymm0 & (1 << vex.v)) { \ |
| 549 | + SD(xZR, xEmu, offsetof(x64emu_t, ymm[vex.v]) + 0); \ |
| 550 | + SD(xZR, xEmu, offsetof(x64emu_t, ymm[vex.v]) + 8); \ |
| 551 | + sse_set_pending_zero(dyn, vex.v, 0); \ |
| 552 | + } \ |
541 | 553 | vyoffset = offsetof(x64emu_t, ymm[vex.v]); |
542 | 554 |
|
543 | 555 | // Get Ex address in general register a, will purge SS or SD if it's reg and is loaded. May use x3. Use wback as load address! |
|
554 | 566 | } |
555 | 567 |
|
556 | 568 |
|
557 | | -#define GETEY() \ |
558 | | - if (MODREG) { \ |
559 | | - ed = (nextop & 7) + (rex.b << 3); \ |
560 | | - /* TODO: forget */ \ |
561 | | - wback = xEmu; \ |
562 | | - fixedaddress = offsetof(x64emu_t, ymm[ed]); \ |
563 | | - } else { \ |
564 | | - fixedaddress += 16; \ |
| 569 | +#define GETEY() \ |
| 570 | + if (MODREG) { \ |
| 571 | + ed = (nextop & 7) + (rex.b << 3); \ |
| 572 | + if (dyn->e.ssecache[ed].v != -1 && dyn->e.ssecache[ed].vector) \ |
| 573 | + avx_flush_upper_vector(dyn, ninst, x3, ed, dyn->e.ssecache[ed].reg, 0, 0); \ |
| 574 | + if (dyn->e.ymm0 & (1 << ed)) { \ |
| 575 | + SD(xZR, xEmu, offsetof(x64emu_t, ymm[ed]) + 0); \ |
| 576 | + SD(xZR, xEmu, offsetof(x64emu_t, ymm[ed]) + 8); \ |
| 577 | + sse_set_pending_zero(dyn, ed, 0); \ |
| 578 | + } \ |
| 579 | + wback = xEmu; \ |
| 580 | + fixedaddress = offsetof(x64emu_t, ymm[ed]); \ |
| 581 | + } else { \ |
| 582 | + fixedaddress += 16; \ |
565 | 583 | } |
566 | 584 |
|
567 | 585 |
|
|
0 commit comments