diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-02-07 16:38:30 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-02-07 09:38:30 +0100 |
| commit | 37697e2ec7484a9bcc00d70a46147365121617a1 (patch) | |
| tree | ed7ca5a43d8a493ce537776d6de38ce092d2c932 /src | |
| parent | f5eb3c1e9bd0269d8f80d382f1c24cad043fae91 (diff) | |
| download | box64-37697e2ec7484a9bcc00d70a46147365121617a1.tar.gz box64-37697e2ec7484a9bcc00d70a46147365121617a1.zip | |
[DYNAREC] Optimized grab_segdata calls on MODREG (#2319)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_64.c | 106 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_6664.c | 28 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_6764_32.c | 12 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_helper.c | 3 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_helper.h | 2 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_64.c | 38 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_6664.c | 2 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_helper.c | 3 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_helper.h | 2 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_64.c | 50 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_6664.c | 4 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.c | 3 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.h | 2 |
13 files changed, 129 insertions, 126 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_64.c b/src/dynarec/arm64/dynarec_arm64_64.c index 70ebf7dc..64421bcd 100644 --- a/src/dynarec/arm64/dynarec_arm64_64.c +++ b/src/dynarec/arm64/dynarec_arm64_64.c @@ -61,8 +61,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x01: INST_NAME("ADD Seg:Ed, Gd"); SETFLAGS(X_ALL, SF_SET_PENDING); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; GETEDO(x4, 0); emit_add32(dyn, ninst, rex, ed, gd, x3, x5); @@ -71,8 +71,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x03: INST_NAME("ADD Gd, Seg:Ed"); SETFLAGS(X_ALL, SF_SET_PENDING); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; GETEDO(x4, 0); emit_add32(dyn, ninst, rex, gd, ed, x3, x4); @@ -81,8 +81,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x0B: INST_NAME("OR Gd, Seg:Ed"); SETFLAGS(X_ALL, SF_SET_PENDING); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; GETEDO(x4, 0); emit_or32(dyn, ninst, rex, gd, ed, x3, x4); @@ -104,7 +104,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin d0 = sse_get_reg(dyn, ninst, x1, ed, 0); VMOVeD(v0, 0, d0, 0); } else { - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); v0 = sse_get_reg_empty(dyn, ninst, x1, gd); SMREAD(); addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<3, 7, rex, NULL, 0, 0); @@ -122,7 +122,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin q0 = sse_get_reg(dyn, ninst, x1, ed, 0); VMOVeS(v0, 0, q0, 0); } else { - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); v0 = sse_get_reg_empty(dyn, ninst, x1, gd); SMREAD(); addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<2, 3, rex, NULL, 0, 0); @@ -146,7 +146,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin v1 = sse_get_reg_empty(dyn, ninst, x1, ed); VMOVQ(v1, v0); } else { - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); v0 = sse_get_reg(dyn, ninst, x1, gd, 0); addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0); ADDz_REG(x4, x4, ed); @@ -164,7 +164,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin d0 = sse_get_reg(dyn, ninst, x1, ed, 1); VMOVeD(d0, 0, v0, 0); } else { - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); v0 = sse_get_reg(dyn, ninst, x1, gd, 0); addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<3, 7, rex, NULL, 0, 0); ADDz_REG(x4, x4, ed); @@ -182,7 +182,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin q0 = sse_get_reg(dyn, ninst, x1, ed, 1); VMOVeS(q0, 0, v0, 0); } else { - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); v0 = sse_get_reg(dyn, ninst, x1, gd, 0); addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<2, 3, rex, NULL, 0, 0); ADDz_REG(x4, x4, ed); @@ -206,7 +206,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0); VMOVQ(v0, v1); } else { - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); v0 = sse_get_reg_empty(dyn, ninst, x1, gd); SMREAD(); addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0); @@ -230,7 +230,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin v1 = sse_get_reg_empty(dyn, ninst, x1, ed); VMOVQ(v1, v0); } else { - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0); ADDz_REG(x4, x4, ed); VST128(v0, x4, fixedaddress); @@ -253,7 +253,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0); VMOVQ(v0, v1); } else { - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); v0 = sse_get_reg_empty(dyn, ninst, x1, gd); SMREAD(); addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0); @@ -273,7 +273,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin INST_NAME("IMUL Gd, Ed"); SETFLAGS(X_ALL, SF_SET); nextop = F8; - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; GETEDO(x4, 0); if(rex.w) { @@ -336,7 +336,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0: INST_NAME("MOVZX Gd, Eb"); nextop = F8; - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; if(MODREG) { if(rex.rex) { @@ -368,8 +368,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin INST_NAME("ADC Gd, Seg:Ed"); READFLAGS(X_CF); SETFLAGS(X_ALL, SF_SET_PENDING); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; GETEDO(x4, 0); emit_adc32(dyn, ninst, rex, gd, ed, x3, x5); @@ -379,8 +379,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin INST_NAME("SBB Gd, Seg:Ed"); READFLAGS(X_CF); SETFLAGS(X_ALL, SF_SET_PENDING); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; GETEDO(x4, 0); emit_sbb32(dyn, ninst, rex, gd, ed, x3, x5); @@ -389,8 +389,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x21: INST_NAME("AND Seg:Ed, Gd"); SETFLAGS(X_ALL, SF_SET_PENDING); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; GETEDO(x4, 0); emit_and32(dyn, ninst, rex, ed, gd, x3, x5); @@ -400,8 +400,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x23: INST_NAME("AND Gd, Seg:Ed"); SETFLAGS(X_ALL, SF_SET_PENDING); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; GETEDO(x4, 0); emit_and32(dyn, ninst, rex, gd, ed, x3, x5); @@ -410,8 +410,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x29: INST_NAME("SUB Seg:Ed, Gd"); SETFLAGS(X_ALL, SF_SET_PENDING); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; GETEDO(x4, 0); emit_sub32(dyn, ninst, rex, ed, gd, x3, x5); @@ -421,8 +421,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x2B: INST_NAME("SUB Gd, Seg:Ed"); SETFLAGS(X_ALL, SF_SET_PENDING); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; GETEDO(x4, 0); emit_sub32(dyn, ninst, rex, gd, ed, x3, x4); @@ -431,8 +431,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x31: INST_NAME("XOR Seg:Ed, Gd"); SETFLAGS(X_ALL, SF_SET_PENDING); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; GETEDO(x4, 0); emit_xor32(dyn, ninst, rex, ed, gd, x3, x5); @@ -442,8 +442,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x33: INST_NAME("XOR Gd, Seg:Ed"); SETFLAGS(X_ALL, SF_SET_PENDING); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; GETEDO(x4, 0); emit_xor32(dyn, ninst, rex, gd, ed, x3, x4); @@ -452,8 +452,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x39: INST_NAME("CMP Seg:Ed, Gd"); SETFLAGS(X_ALL, SF_SET_PENDING); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; GETEDO(x4, 0); emit_cmp32(dyn, ninst, rex, ed, gd, x3, x4, x5); @@ -462,8 +462,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x3B: INST_NAME("CMP Gd, Seg:Ed"); SETFLAGS(X_ALL, SF_SET_PENDING); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; GETEDO(x4, 0); emit_cmp32(dyn, ninst, rex, gd, ed, x3, x4, x5); @@ -500,7 +500,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin if(MODREG) { // reg <= reg SXTWx(gd, TO_NAT((nextop & 7) + (rex.b << 3))); } else { // mem <= reg - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); SMREAD(); addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0); LDRSW_REGz(gd, x4, ed); @@ -509,7 +509,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin if(MODREG) { // reg <= reg MOVw_REG(gd, TO_NAT((nextop & 7) + (rex.b << 3))); } else { // mem <= reg - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); SMREAD(); addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0); LDRw_REGz(gd, x4, ed); @@ -538,7 +538,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin INST_NAME("IMUL Gd, Ed, Id"); SETFLAGS(X_ALL, SF_SET); nextop = F8; - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; GETEDO(x4, 4); i64 = F32S; @@ -650,7 +650,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin switch((nextop>>3)&7) { case 0: //ADD INST_NAME("ADD Eb, Ib"); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); SETFLAGS(X_ALL, SF_SET_PENDING); GETEBO(x1, 1); u8 = F8; @@ -659,7 +659,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 1: //OR INST_NAME("OR Eb, Ib"); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); SETFLAGS(X_ALL, SF_SET_PENDING); GETEBO(x1, 1); u8 = F8; @@ -668,7 +668,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 2: //ADC INST_NAME("ADC Eb, Ib"); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); READFLAGS(X_CF); SETFLAGS(X_ALL, SF_SET_PENDING); GETEBO(x1, 1); @@ -678,7 +678,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 3: //SBB INST_NAME("SBB Eb, Ib"); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); READFLAGS(X_CF); SETFLAGS(X_ALL, SF_SET_PENDING); GETEBO(x1, 1); @@ -688,7 +688,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 4: //AND INST_NAME("AND Eb, Ib"); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); SETFLAGS(X_ALL, SF_SET_PENDING); GETEBO(x1, 1); u8 = F8; @@ -697,7 +697,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 5: //SUB INST_NAME("SUB Eb, Ib"); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); SETFLAGS(X_ALL, SF_SET_PENDING); GETEBO(x1, 1); u8 = F8; @@ -706,7 +706,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 6: //XOR INST_NAME("XOR Eb, Ib"); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); SETFLAGS(X_ALL, SF_SET_PENDING); GETEBO(x1, 1); u8 = F8; @@ -715,7 +715,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 7: //CMP INST_NAME("CMP Eb, Ib"); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); SETFLAGS(X_ALL, SF_SET_PENDING); GETEBO(x1, 1); u8 = F8; @@ -733,7 +733,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x81: case 0x83: nextop = F8; - grab_segdata(dyn, addr, ninst, x6, seg); + grab_segdata(dyn, addr, ninst, x6, seg, (MODREG)); switch((nextop>>3)&7) { case 0: //ADD if(opcode==0x81) {INST_NAME("ADD Ed, Id");} else {INST_NAME("ADD Ed, Ib");} @@ -813,7 +813,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin INST_NAME("TEST Ed, Gd"); SETFLAGS(X_ALL, SF_SET_PENDING); nextop=F8; - grab_segdata(dyn, addr, ninst, x6, seg); + grab_segdata(dyn, addr, ninst, x6, seg, (MODREG)); GETGD; GETEDO(x6, 0); emit_test32(dyn, ninst, rex, ed, gd, x3, x5, x6); @@ -847,15 +847,15 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } BFIx(eb1, gd, eb2*8, 8); } else { - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0); STRB_REGz(gd, x4, wback); } break; case 0x89: INST_NAME("MOV Seg:Ed, Gd"); - grab_segdata(dyn, addr, ninst, x4, seg); - nextop=F8; + nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; if(MODREG) { // reg <= reg MOVxw_REG(TO_NAT((nextop & 7) + (rex.b << 3)), gd); @@ -892,7 +892,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin ed = wback; } } else { - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); SMREAD(); addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0); LDRB_REGz(x4, x4, wback); @@ -902,8 +902,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x8B: INST_NAME("MOV Gd, Seg:Ed"); - grab_segdata(dyn, addr, ninst, x4, seg); - nextop=F8; + nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; if(MODREG) { // reg <= reg MOVxw_REG(gd, TO_NAT((nextop & 7) + (rex.b << 3))); @@ -932,8 +932,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x8E: INST_NAME("MOV Seg,Ew"); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); u8 = (nextop&0x38)>>3; if (MODREG) { ed = TO_NAT((nextop & 7) + (rex.b << 3)); @@ -948,8 +948,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x8F: INST_NAME("POP FS:Ed"); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); if(MODREG) { POP1z(TO_NAT((nextop & 7) + (rex.b << 3))); } else { @@ -987,7 +987,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0xA1: INST_NAME("MOV EAX,FS:Od"); - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, 0); if(rex.is32bits) u64 = F32; else @@ -997,7 +997,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0xA2: INST_NAME("MOV FS:Od,AL"); - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, 0); if(rex.is32bits) u64 = F32; else @@ -1008,7 +1008,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0xA3: INST_NAME("MOV FS:Od,EAX"); - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, 0); if(rex.is32bits) u64 = F32; else @@ -1028,8 +1028,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0xC6: INST_NAME("MOV Seg:Eb, Ib"); - grab_segdata(dyn, addr, ninst, x4, seg); nextop=F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); if(MODREG) { // reg <= u8 u8 = F8; if(!rex.rex) { @@ -1052,8 +1052,8 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0xC7: INST_NAME("MOV Seg:Ed, Id"); - grab_segdata(dyn, addr, ninst, x4, seg); nextop=F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); if(MODREG) { // reg <= i32 i64 = F32S; ed = TO_NAT((nextop & 7) + (rex.b << 3)); @@ -1069,7 +1069,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0xD1: nextop = F8; - grab_segdata(dyn, addr, ninst, x6, seg); + grab_segdata(dyn, addr, ninst, x6, seg, (MODREG)); switch((nextop>>3)&7) { case 0: INST_NAME("ROL Ed, 1"); @@ -1127,7 +1127,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0xD3: nextop = F8; - grab_segdata(dyn, addr, ninst, x6, seg); + grab_segdata(dyn, addr, ninst, x6, seg, (MODREG)); switch((nextop>>3)&7) { case 0: INST_NAME("ROL Ed, CL"); @@ -1271,7 +1271,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0xF7: nextop = F8; - grab_segdata(dyn, addr, ninst, x6, seg); + grab_segdata(dyn, addr, ninst, x6, seg, (MODREG)); switch((nextop>>3)&7) { case 0: case 1: @@ -1513,7 +1513,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0xFF: nextop = F8; - grab_segdata(dyn, addr, ninst, x6, seg); + grab_segdata(dyn, addr, ninst, x6, seg, (MODREG)); switch((nextop>>3)&7) { case 0: // INC Ed INST_NAME("INC Ed"); diff --git a/src/dynarec/arm64/dynarec_arm64_6664.c b/src/dynarec/arm64/dynarec_arm64_6664.c index f2dbee70..87ee3961 100644 --- a/src/dynarec/arm64/dynarec_arm64_6664.c +++ b/src/dynarec/arm64/dynarec_arm64_6664.c @@ -58,7 +58,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n if(MODREG) { v1 = sse_get_reg(dyn, ninst, x1, (nextop&7) + (rex.b<<3), 0); } else { - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); SMREAD(); addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<3, 7, rex, NULL, 0, 0); ADDz_REG(x4, x4, ed); @@ -79,7 +79,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n VMOVQ(v0, v1); } else { GETGX_empty(v0); - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0); SMREAD(); ADDz_REG(x4, x4, ed); @@ -96,7 +96,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 1); VMOVQ(v1, v0); } else { - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0); ADDz_REG(x4, x4, ed); ed = x4; @@ -114,7 +114,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n v1 = sse_get_reg_empty(dyn, ninst, x1, (nextop&7) + (rex.b<<3)); FMOVD(v1, v0); } else { - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<3, 7, rex, NULL, 0, 0); ADDz_REG(x4, x4, ed); ed = x4; @@ -134,7 +134,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n case 0: //ADD if(opcode==0x81) {INST_NAME("ADD Ew, Iw");} else {INST_NAME("ADD Ew, Ib");} SETFLAGS(X_ALL, SF_SET_PENDING); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); GETEWO(x1, (opcode==0x81)?2:1); if(opcode==0x81) i16 = F16S; else i16 = F8S; MOVZw(x5, i16); @@ -144,7 +144,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n case 1: //OR if(opcode==0x81) {INST_NAME("OR Ew, Iw");} else {INST_NAME("OR Ew, Ib");} SETFLAGS(X_ALL, SF_SET_PENDING); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); GETEWO(x1, (opcode==0x81)?2:1); if(opcode==0x81) i16 = F16S; else i16 = F8S; emit_or16c(dyn, ninst, x1, i16, x2, x4); @@ -154,7 +154,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n if(opcode==0x81) {INST_NAME("ADC Ew, Iw");} else {INST_NAME("ADC Ew, Ib");} READFLAGS(X_CF); SETFLAGS(X_ALL, SF_SET_PENDING); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); GETEWO(x1, (opcode==0x81)?2:1); if(opcode==0x81) i16 = F16S; else i16 = F8S; MOVZw(x5, i16); @@ -165,7 +165,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n if(opcode==0x81) {INST_NAME("SBB Ew, Iw");} else {INST_NAME("SBB Ew, Ib");} READFLAGS(X_CF); SETFLAGS(X_ALL, SF_SET_PENDING); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); GETEWO(x1, (opcode==0x81)?2:1); if(opcode==0x81) i16 = F16S; else i16 = F8S; MOVZw(x5, i16); @@ -175,7 +175,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n case 4: //AND if(opcode==0x81) {INST_NAME("AND Ew, Iw");} else {INST_NAME("AND Ew, Ib");} SETFLAGS(X_ALL, SF_SET_PENDING); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); GETEWO(x1, (opcode==0x81)?2:1); if(opcode==0x81) i16 = F16S; else i16 = F8S; emit_and16c(dyn, ninst, x1, i16, x2, x4); @@ -184,7 +184,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n case 5: //SUB if(opcode==0x81) {INST_NAME("SUB Ew, Iw");} else {INST_NAME("SUB Ew, Ib");} SETFLAGS(X_ALL, SF_SET_PENDING); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); GETEWO(x1, (opcode==0x81)?2:1); if(opcode==0x81) i16 = F16S; else i16 = F8S; MOVZw(x5, i16); @@ -194,7 +194,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n case 6: //XOR if(opcode==0x81) {INST_NAME("XOR Ew, Iw");} else {INST_NAME("XOR Ew, Ib");} SETFLAGS(X_ALL, SF_SET_PENDING); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); GETEWO(x1, (opcode==0x81)?2:1); if(opcode==0x81) i16 = F16S; else i16 = F8S; emit_xor16c(dyn, ninst, x1, i16, x2, x4); @@ -203,7 +203,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n case 7: //CMP if(opcode==0x81) {INST_NAME("CMP Ew, Iw");} else {INST_NAME("CMP Ew, Ib");} SETFLAGS(X_ALL, SF_SET_PENDING); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); GETEWO(x1, (opcode==0x81)?2:1); if(opcode==0x81) i16 = F16S; else i16 = F8S; if(i16) { @@ -229,7 +229,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n } } } else { - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0xfff<<(rex.w?3:1), rex.w?7:1, rex, NULL, 0, 0); ADDz_REG(x4, x4, ed); ed = x4; @@ -256,7 +256,7 @@ uintptr_t dynarec64_6664(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n } } } else { // mem <= reg - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); SMREAD(); addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0xfff<<(rex.w?3:1), rex.w?7:1, rex, NULL, 0, 0); ADDz_REG(x4, x4, ed); diff --git a/src/dynarec/arm64/dynarec_arm64_6764_32.c b/src/dynarec/arm64/dynarec_arm64_6764_32.c index 4076c7d3..1a0283f6 100644 --- a/src/dynarec/arm64/dynarec_arm64_6764_32.c +++ b/src/dynarec/arm64/dynarec_arm64_6764_32.c @@ -68,7 +68,7 @@ uintptr_t dynarec64_6764_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, in if(MODREG) { // reg <= reg MOVxw_REG(TO_NAT((nextop & 7) + (rex.b << 3)), gd); } else { // mem <= reg - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); addr = geted16(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0xfff<<2, 3, 0); ADDz_REG(x4, x4, ed); STz(gd, x4, fixedaddress); @@ -82,7 +82,7 @@ uintptr_t dynarec64_6764_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, in if(MODREG) { // reg => reg MOVxw_REG(gd, TO_NAT((nextop & 7) + (rex.b << 3))); } else { // mem => reg - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); addr = geted16(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0xfff<<2, 3, 0); ADDz_REG(x4, x4, ed); LDz(gd, x4, fixedaddress); @@ -96,7 +96,7 @@ uintptr_t dynarec64_6764_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, in POP1_32(x1); MOVxw_REG(TO_NAT((nextop & 7) + (rex.b << 3)), x1); } else { // mem <= reg - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); POP1_32(x1); addr = geted16(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0xfff<<2, 3, 0); ADDz_REG(x4, x4, ed); @@ -107,7 +107,7 @@ uintptr_t dynarec64_6764_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, in case 0xA1: INST_NAME("MOV EAX, Seg:[Od]"); i32 = F16; - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, 0); if(i32<4096 && !(i32&3)) { LDRw_U12(xRAX, x4, i32); } else if(i32<256) { @@ -121,7 +121,7 @@ uintptr_t dynarec64_6764_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, in case 0xA3: INST_NAME("MOV Seg:[Od], EAX"); i32 = F16; - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, 0); if(i32<4096 && !(i32&3)) { STRw_U12(xRAX, x4, i32); } else if(i32<256) { @@ -134,7 +134,7 @@ uintptr_t dynarec64_6764_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, in case 0xFF: nextop = F8; - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); switch((nextop>>3)&7) { case 6: // Push Ed INST_NAME("PUSH FS:Ew"); diff --git a/src/dynarec/arm64/dynarec_arm64_helper.c b/src/dynarec/arm64/dynarec_arm64_helper.c index 313345e8..4c8680a8 100644 --- a/src/dynarec/arm64/dynarec_arm64_helper.c +++ b/src/dynarec/arm64/dynarec_arm64_helper.c @@ -858,11 +858,12 @@ void call_n(dynarec_arm_t* dyn, int ninst, void* fnc, int w) //SET_NODF(); } -void grab_segdata(dynarec_arm_t* dyn, uintptr_t addr, int ninst, int reg, int segment) +void grab_segdata(dynarec_arm_t* dyn, uintptr_t addr, int ninst, int reg, int segment, int modreg) { (void)addr; int64_t j64; MAYUSE(j64); + if (modreg) return; MESSAGE(LOG_DUMP, "Get %s Offset\n", (segment==_FS)?"FS":"GS"); int t2 = x4; if(reg==t2) ++t2; diff --git a/src/dynarec/arm64/dynarec_arm64_helper.h b/src/dynarec/arm64/dynarec_arm64_helper.h index f5a7104f..56b388d4 100644 --- a/src/dynarec/arm64/dynarec_arm64_helper.h +++ b/src/dynarec/arm64/dynarec_arm64_helper.h @@ -1433,7 +1433,7 @@ void retn_to_epilog(dynarec_arm_t* dyn, int ninst, rex_t rex, int n); void iret_to_epilog(dynarec_arm_t* dyn, int ninst, int is32bits, int is64bits); void call_c(dynarec_arm_t* dyn, int ninst, void* fnc, int reg, int ret, int saveflags, int save_reg); void call_n(dynarec_arm_t* dyn, int ninst, void* fnc, int w); -void grab_segdata(dynarec_arm_t* dyn, uintptr_t addr, int ninst, int reg, int segment); +void grab_segdata(dynarec_arm_t* dyn, uintptr_t addr, int ninst, int reg, int segment, int modreg); void emit_cmp8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); void emit_cmp16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5); void emit_cmp32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5); diff --git a/src/dynarec/la64/dynarec_la64_64.c b/src/dynarec/la64/dynarec_la64_64.c index a3219ac8..44aced0b 100644 --- a/src/dynarec/la64/dynarec_la64_64.c +++ b/src/dynarec/la64/dynarec_la64_64.c @@ -64,8 +64,8 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 0x03: INST_NAME("ADD Gd, Seg:Ed"); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; GETEDO(x4, 0); emit_add32(dyn, ninst, rex, gd, ed, x3, x4, x5); @@ -73,8 +73,8 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 0x2B: INST_NAME("SUB Gd, Seg:Ed"); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; GETEDO(x4, 0); emit_sub32(dyn, ninst, rex, gd, ed, x3, x4, x5); @@ -82,8 +82,8 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 0x33: INST_NAME("XOR Gd, Seg:Ed"); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; GETEDO(x4, 0); emit_xor32(dyn, ninst, rex, gd, ed, x3, x4); @@ -102,7 +102,7 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni switch ((nextop >> 3) & 7) { case 0: // ADD INST_NAME("ADD Eb, Ib"); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); GETEBO(x1, 1); u8 = F8; @@ -111,7 +111,7 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 1: // OR INST_NAME("OR Eb, Ib"); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); GETEBO(x1, 1); u8 = F8; @@ -120,7 +120,7 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 2: // ADC INST_NAME("ADC Eb, Ib"); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); READFLAGS(X_CF); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); GETEBO(x1, 1); @@ -130,7 +130,7 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 3: // SBB INST_NAME("SBB Eb, Ib"); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); READFLAGS(X_CF); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); GETEBO(x1, 1); @@ -140,7 +140,7 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 4: // AND INST_NAME("AND Eb, Ib"); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); GETEBO(x1, 1); u8 = F8; @@ -149,7 +149,7 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 5: // SUB INST_NAME("SUB Eb, Ib"); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); GETEBO(x1, 1); u8 = F8; @@ -158,7 +158,7 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 6: // XOR INST_NAME("XOR Eb, Ib"); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); GETEBO(x1, 1); u8 = F8; @@ -167,7 +167,7 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 7: // CMP INST_NAME("CMP Eb, Ib"); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); GETEBO(x1, 1); u8 = F8; @@ -185,7 +185,7 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 0x81: case 0x83: nextop = F8; - grab_segdata(dyn, addr, ninst, x6, seg); + grab_segdata(dyn, addr, ninst, x6, seg, (MODREG)); switch ((nextop >> 3) & 7) { case 0: if (opcode == 0x81) { @@ -349,15 +349,15 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } BSTRINS_D(eb1, gd, eb2 + 7, eb2); } else { - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); addr = geted(dyn, addr, ninst, nextop, &wback, x2, x1, &fixedaddress, rex, NULL, 1, 0); STX_B(gd, x4, wback); } break; case 0x89: INST_NAME("MOV Seg:Ed, Gd"); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; if (MODREG) { // reg <= reg MVxw(TO_NAT((nextop & 7) + (rex.b << 3)), gd); @@ -375,8 +375,8 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 0x8B: INST_NAME("MOV Gd, Seg:Ed"); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; if (MODREG) { // reg <= reg MVxw(gd, TO_NAT((nextop & 7) + (rex.b << 3))); @@ -394,8 +394,8 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 0x8E: INST_NAME("MOV Seg, Ew"); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); u8 = (nextop & 0x38) >> 3; if (MODREG) { ed = TO_NAT((nextop & 7) + (rex.b << 3)); @@ -411,7 +411,7 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 0xA1: INST_NAME("MOV EAX, FS:Od"); - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, 0); if (rex.is32bits) u64 = F32; else @@ -425,8 +425,8 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 0xC6: INST_NAME("MOV Seg:Eb, Ib"); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); if (MODREG) { // reg <= u8 u8 = F8; if (!rex.rex) { @@ -458,8 +458,8 @@ uintptr_t dynarec64_64(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 0xC7: INST_NAME("MOV Seg:Ed, Id"); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); if (MODREG) { // reg <= i32 i64 = F32S; ed = TO_NAT((nextop & 7) + (rex.b << 3)); diff --git a/src/dynarec/la64/dynarec_la64_6664.c b/src/dynarec/la64/dynarec_la64_6664.c index 3022d733..15c81000 100644 --- a/src/dynarec/la64/dynarec_la64_6664.c +++ b/src/dynarec/la64/dynarec_la64_6664.c @@ -51,7 +51,7 @@ uintptr_t dynarec64_6664(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int if (ed != gd) BSTRINS_D(gd, ed, 15, 0); } } else { // mem <= reg - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); SMREAD(); addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0); ADDz(x4, ed, x4); diff --git a/src/dynarec/la64/dynarec_la64_helper.c b/src/dynarec/la64/dynarec_la64_helper.c index 627aa698..b807949e 100644 --- a/src/dynarec/la64/dynarec_la64_helper.c +++ b/src/dynarec/la64/dynarec_la64_helper.c @@ -760,11 +760,12 @@ void call_c(dynarec_la64_t* dyn, int ninst, void* fnc, int reg, int ret, int sav dyn->last_ip = 0; } -void grab_segdata(dynarec_la64_t* dyn, uintptr_t addr, int ninst, int reg, int segment) +void grab_segdata(dynarec_la64_t* dyn, uintptr_t addr, int ninst, int reg, int segment, int modreg) { (void)addr; int64_t j64; MAYUSE(j64); + if (modreg) return; MESSAGE(LOG_DUMP, "Get %s Offset\n", (segment == _FS) ? "FS" : "GS"); int t1 = x1, t2 = x4; if (reg == t1) ++t1; diff --git a/src/dynarec/la64/dynarec_la64_helper.h b/src/dynarec/la64/dynarec_la64_helper.h index a109812e..495fa44e 100644 --- a/src/dynarec/la64/dynarec_la64_helper.h +++ b/src/dynarec/la64/dynarec_la64_helper.h @@ -950,7 +950,7 @@ void ret_to_epilog(dynarec_la64_t* dyn, int ninst, rex_t rex); void retn_to_epilog(dynarec_la64_t* dyn, int ninst, rex_t rex, int n); void iret_to_epilog(dynarec_la64_t* dyn, int ninst, int is64bits); void call_c(dynarec_la64_t* dyn, int ninst, void* fnc, int reg, int ret, int saveflags, int save_reg); -void grab_segdata(dynarec_la64_t* dyn, uintptr_t addr, int ninst, int reg, int segment); +void grab_segdata(dynarec_la64_t* dyn, uintptr_t addr, int ninst, int reg, int segment, int modreg); void emit_cmp8(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5, int s6); void emit_cmp16(dynarec_la64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5, int s6); void emit_cmp32(dynarec_la64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5, int s6); diff --git a/src/dynarec/rv64/dynarec_rv64_64.c b/src/dynarec/rv64/dynarec_rv64_64.c index 87c2bd61..c7b7885e 100644 --- a/src/dynarec/rv64/dynarec_rv64_64.c +++ b/src/dynarec/rv64/dynarec_rv64_64.c @@ -63,8 +63,8 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 0x03: INST_NAME("ADD Gd, Seg:Ed"); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; GETEDO(x4, 0, x5); emit_add32(dyn, ninst, rex, gd, ed, x3, x4, x5); @@ -80,7 +80,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni GETGX(); GETEX(x2, 0, 8); if (!MODREG) { - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); ADDz(x4, x4, wback); wback = x4; } @@ -101,7 +101,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni d0 = sse_get_reg(dyn, ninst, x1, ed, 0); FMVD(d0, v0); } else { - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); addr = geted(dyn, addr, ninst, nextop, &ed, x1, x2, &fixedaddress, rex, NULL, 1, 0); ADDz(x4, x4, ed); ed = x4; @@ -118,7 +118,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni q0 = sse_get_reg(dyn, ninst, x1, (nextop & 7) + (rex.b << 3), 1); FMVS(q0, v0); } else { - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); addr = geted(dyn, addr, ninst, nextop, &ed, x1, x2, &fixedaddress, rex, NULL, 1, 0); ADDz(x4, x4, ed); ed = x4; @@ -138,8 +138,8 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 0x2B: INST_NAME("SUB Gd, Seg:Ed"); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; GETEDO(x4, 0, x5); emit_sub32(dyn, ninst, rex, gd, ed, x3, x4, x5); @@ -148,8 +148,8 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 0x33: INST_NAME("XOR Gd, Seg:Ed"); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; GETEDO(x4, 0, x5); emit_xor32(dyn, ninst, rex, gd, ed, x3, x4); @@ -163,7 +163,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni switch ((nextop >> 3) & 7) { case 0: // ADD INST_NAME("ADD Eb, Ib"); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); GETEBO(x1, 1); u8 = F8; @@ -172,7 +172,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 1: // OR INST_NAME("OR Eb, Ib"); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); GETEBO(x1, 1); u8 = F8; @@ -181,7 +181,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 2: // ADC INST_NAME("ADC Eb, Ib"); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); READFLAGS(X_CF); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); GETEBO(x1, 1); @@ -191,7 +191,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 3: // SBB INST_NAME("SBB Eb, Ib"); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); READFLAGS(X_CF); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); GETEBO(x1, 1); @@ -201,7 +201,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 4: // AND INST_NAME("AND Eb, Ib"); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); GETEBO(x1, 1); u8 = F8; @@ -210,7 +210,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 5: // SUB INST_NAME("SUB Eb, Ib"); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); GETEBO(x1, 1); u8 = F8; @@ -219,7 +219,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 6: // XOR INST_NAME("XOR Eb, Ib"); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); GETEBO(x1, 1); u8 = F8; @@ -228,7 +228,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 7: // CMP INST_NAME("CMP Eb, Ib"); - grab_segdata(dyn, addr, ninst, x1, seg); + grab_segdata(dyn, addr, ninst, x1, seg, (MODREG)); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); GETEBO(x1, 1); u8 = F8; @@ -246,7 +246,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 0x81: case 0x83: nextop = F8; - grab_segdata(dyn, addr, ninst, x6, seg); + grab_segdata(dyn, addr, ninst, x6, seg, (MODREG)); switch ((nextop >> 3) & 7) { case 0: // ADD if (opcode == 0x81) { @@ -381,8 +381,8 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 0x88: INST_NAME("MOV Seg:Eb, Gb"); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); gd = ((nextop & 0x38) >> 3) + (rex.r << 3); if (rex.rex) { gb2 = 0; @@ -424,8 +424,8 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 0x89: INST_NAME("MOV Seg:Ed, Gd"); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; if (MODREG) { // reg <= reg MVxw(TO_NAT((nextop & 7) + (rex.b << 3)), gd); @@ -439,8 +439,8 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 0x8B: INST_NAME("MOV Gd, Seg:Ed"); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); GETGD; if (MODREG) { // reg <= reg MVxw(gd, TO_NAT((nextop & 7) + (rex.b << 3))); @@ -453,8 +453,8 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 0x8E: INST_NAME("MOV Seg,Ew"); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); u8 = (nextop & 0x38) >> 3; if (MODREG) { ed = TO_NAT((nextop & 7) + (rex.b << 3)); @@ -470,8 +470,8 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 0x8F: INST_NAME("POP FS:Ed"); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); if (MODREG) { POP1z(TO_NAT((nextop & 7) + (rex.b << 3))); } else { @@ -491,7 +491,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 0xA1: INST_NAME("MOV EAX,FS:Od"); - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, 0); if (rex.is32bits) u64 = F32; else @@ -504,7 +504,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 0xA3: INST_NAME("MOV FS:Od,EAX"); - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, 0); if (rex.is32bits) u64 = F32; else @@ -518,8 +518,8 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 0xC6: INST_NAME("MOV Seg:Eb, Ib"); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); if (MODREG) { // reg <= u8 u8 = F8; if (!rex.rex) { @@ -565,8 +565,8 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 0xC7: INST_NAME("MOV Seg:Ed, Id"); - grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); if (MODREG) { // reg <= i32 i64 = F32S; ed = TO_NAT((nextop & 7) + (rex.b << 3)); @@ -590,7 +590,7 @@ uintptr_t dynarec64_64(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni switch ((nextop >> 3) & 7) { case 6: // Push Ed INST_NAME("PUSH Ed"); - grab_segdata(dyn, addr, ninst, x6, seg); + grab_segdata(dyn, addr, ninst, x6, seg, (MODREG)); GETEDOz(x6, 0, x3); PUSH1z(ed); break; diff --git a/src/dynarec/rv64/dynarec_rv64_6664.c b/src/dynarec/rv64/dynarec_rv64_6664.c index a76846ce..2afc198d 100644 --- a/src/dynarec/rv64/dynarec_rv64_6664.c +++ b/src/dynarec/rv64/dynarec_rv64_6664.c @@ -55,7 +55,7 @@ uintptr_t dynarec64_6664(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int } } } else { - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0); ADDz(x4, ed, x4); if (rex.w) { @@ -84,7 +84,7 @@ uintptr_t dynarec64_6664(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int } } } else { // mem <= reg - grab_segdata(dyn, addr, ninst, x4, seg); + grab_segdata(dyn, addr, ninst, x4, seg, (MODREG)); SMREAD(); addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0); ADDz(x4, ed, x4); diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c index 1a7d0f97..54a49850 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.c +++ b/src/dynarec/rv64/dynarec_rv64_helper.c @@ -872,11 +872,12 @@ void call_n(dynarec_rv64_t* dyn, int ninst, void* fnc, int w) // SET_NODF(); } -void grab_segdata(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, int reg, int segment) +void grab_segdata(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, int reg, int segment, int modreg) { (void)addr; int64_t j64; MAYUSE(j64); + if (modreg) return; MESSAGE(LOG_DUMP, "Get %s Offset\n", (segment == _FS) ? "FS" : "GS"); int t1 = x1, t2 = x4; if (reg == t1) ++t1; diff --git a/src/dynarec/rv64/dynarec_rv64_helper.h b/src/dynarec/rv64/dynarec_rv64_helper.h index 5669406f..909a2054 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.h +++ b/src/dynarec/rv64/dynarec_rv64_helper.h @@ -1394,7 +1394,7 @@ void retn_to_epilog(dynarec_rv64_t* dyn, int ninst, rex_t rex, int n); void iret_to_epilog(dynarec_rv64_t* dyn, int ninst, int is64bits); void call_c(dynarec_rv64_t* dyn, int ninst, void* fnc, int reg, int ret, int saveflags, int savereg, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6); void call_n(dynarec_rv64_t* dyn, int ninst, void* fnc, int w); -void grab_segdata(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, int reg, int segment); +void grab_segdata(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, int reg, int segment, int modreg); void emit_cmp8(dynarec_rv64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5, int s6); void emit_cmp16(dynarec_rv64_t* dyn, int ninst, int s1, int s2, int s3, int s4, int s5, int s6); void emit_cmp32(dynarec_rv64_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3, int s4, int s5, int s6); |