From f6ce622841efcb4da5e06b1fbb0f869b1dac99b6 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sat, 12 Jun 2021 20:41:34 +0200 Subject: [DYNAREC] Improved flag handling --- src/dynarec/dynarec_arm64_00.c | 164 ++++++++++++++++++------------------- src/dynarec/dynarec_arm64_64.c | 36 ++++---- src/dynarec/dynarec_arm64_66.c | 72 ++++++++-------- src/dynarec/dynarec_arm64_f0.c | 44 +++++----- src/dynarec/dynarec_arm64_helper.h | 10 ++- src/dynarec/dynarec_private.h | 5 +- 6 files changed, 167 insertions(+), 164 deletions(-) (limited to 'src') diff --git a/src/dynarec/dynarec_arm64_00.c b/src/dynarec/dynarec_arm64_00.c index c8c3a10b..4e0721d2 100755 --- a/src/dynarec/dynarec_arm64_00.c +++ b/src/dynarec/dynarec_arm64_00.c @@ -46,7 +46,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin switch(opcode) { case 0x00: INST_NAME("ADD Eb, Gb"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETEB(x1, 0); GETGB(x2); @@ -55,7 +55,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x01: INST_NAME("ADD Ed, Gd"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGD; GETED(0); @@ -64,7 +64,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x02: INST_NAME("ADD Gb, Eb"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETEB(x2, 0); GETGB(x1); @@ -73,7 +73,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x03: INST_NAME("ADD Gd, Ed"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGD; GETED(0); @@ -81,7 +81,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x04: INST_NAME("ADD AL, Ib"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); u8 = F8; UXTBw(x1, xRAX); emit_add8c(dyn, ninst, x1, u8, x3, x4); @@ -89,14 +89,14 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x05: INST_NAME("ADD EAX, Id"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); i64 = F32S; emit_add32c(dyn, ninst, rex, xRAX, i64, x3, x4, x5); break; case 0x08: INST_NAME("OR Eb, Gb"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETEB(x1, 0); GETGB(x2); @@ -105,7 +105,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x09: INST_NAME("OR Ed, Gd"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGD; GETED(0); @@ -114,7 +114,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x0A: INST_NAME("OR Gb, Eb"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETEB(x2, 0); GETGB(x1); @@ -123,7 +123,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x0B: INST_NAME("OR Gd, Ed"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGD; GETED(0); @@ -131,7 +131,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x0C: INST_NAME("OR AL, Ib"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); u8 = F8; UXTBw(x1, xRAX); emit_or8c(dyn, ninst, x1, u8, x3, x4); @@ -139,7 +139,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x0D: INST_NAME("OR EAX, Id"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); i64 = F32S; emit_or32c(dyn, ninst, rex, xRAX, i64, x3, x4); break; @@ -159,7 +159,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x10: INST_NAME("ADC Eb, Gb"); READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETEB(x1, 0); GETGB(x2); @@ -169,7 +169,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x11: INST_NAME("ADC Ed, Gd"); READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGD; GETED(0); @@ -179,7 +179,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x12: INST_NAME("ADC Gb, Eb"); READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETEB(x2, 0); GETGB(x1); @@ -189,7 +189,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x13: INST_NAME("ADC Gd, Ed"); READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGD; GETED(0); @@ -198,7 +198,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x14: INST_NAME("ADC AL, Ib"); READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); u8 = F8; UXTBw(x1, xRAX); emit_adc8c(dyn, ninst, x1, u8, x3, x4, x5); @@ -207,7 +207,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x15: INST_NAME("ADC EAX, Id"); READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); i64 = F32S; MOV64xw(x1, i64); emit_adc32(dyn, ninst, rex, xRAX, x1, x3, x4); @@ -216,7 +216,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x18: INST_NAME("SBB Eb, Gb"); READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETEB(x1, 0); GETGB(x2); @@ -226,7 +226,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x19: INST_NAME("SBB Ed, Gd"); READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGD; GETED(0); @@ -236,7 +236,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x1A: INST_NAME("SBB Gb, Eb"); READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETEB(x2, 0); GETGB(x1); @@ -246,7 +246,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x1B: INST_NAME("SBB Gd, Ed"); READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGD; GETED(0); @@ -255,7 +255,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x1C: INST_NAME("SBB AL, Ib"); READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); u8 = F8; UXTBw(x1, xRAX); emit_sbb8c(dyn, ninst, x1, u8, x3, x4, x5); @@ -264,7 +264,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x1D: INST_NAME("SBB EAX, Id"); READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); i64 = F32S; MOV64xw(x2, i64); emit_sbb32(dyn, ninst, rex, xRAX, x2, x3, x4); @@ -272,7 +272,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x20: INST_NAME("AND Eb, Gb"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETEB(x1, 0); GETGB(x2); @@ -281,7 +281,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x21: INST_NAME("AND Ed, Gd"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGD; GETED(0); @@ -290,7 +290,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x22: INST_NAME("AND Gb, Eb"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETEB(x2, 0); GETGB(x1); @@ -299,7 +299,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x23: INST_NAME("AND Gd, Ed"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGD; GETED(0); @@ -307,7 +307,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x24: INST_NAME("AND AL, Ib"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); u8 = F8; UXTBw(x1, xRAX); emit_and8c(dyn, ninst, x1, u8, x3, x4); @@ -315,14 +315,14 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x25: INST_NAME("AND EAX, Id"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); i64 = F32S; emit_and32c(dyn, ninst, rex, xRAX, i64, x3, x4); break; case 0x28: INST_NAME("SUB Eb, Gb"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETEB(x1, 0); GETGB(x2); @@ -331,7 +331,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x29: INST_NAME("SUB Ed, Gd"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGD; GETED(0); @@ -340,7 +340,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x2A: INST_NAME("SUB Gb, Eb"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETEB(x2, 0); GETGB(x1); @@ -349,7 +349,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x2B: INST_NAME("SUB Gd, Ed"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGD; GETED(0); @@ -357,7 +357,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x2C: INST_NAME("SUB AL, Ib"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); u8 = F8; UXTBw(x1, xRAX); emit_sub8c(dyn, ninst, x1, u8, x3, x4, x5); @@ -365,14 +365,14 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x2D: INST_NAME("SUB EAX, Id"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); i64 = F32S; emit_sub32c(dyn, ninst, rex, xRAX, i64, x3, x4, x5); break; case 0x30: INST_NAME("XOR Eb, Gb"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETEB(x1, 0); GETGB(x2); @@ -381,7 +381,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x31: INST_NAME("XOR Ed, Gd"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGD; GETED(0); @@ -390,7 +390,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x32: INST_NAME("XOR Gb, Eb"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETEB(x2, 0); GETGB(x1); @@ -399,7 +399,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x33: INST_NAME("XOR Gd, Ed"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGD; GETED(0); @@ -407,7 +407,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x34: INST_NAME("XOR AL, Ib"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); u8 = F8; UXTBw(x1, xRAX); emit_xor8c(dyn, ninst, x1, u8, x3, x4); @@ -415,14 +415,14 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x35: INST_NAME("XOR EAX, Id"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); i64 = F32S; emit_xor32c(dyn, ninst, rex, xRAX, i64, x3, x4); break; case 0x38: INST_NAME("CMP Eb, Gb"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETEB(x1, 0); GETGB(x2); @@ -430,7 +430,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x39: INST_NAME("CMP Ed, Gd"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGD; GETED(0); @@ -438,7 +438,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x3A: INST_NAME("CMP Gb, Eb"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETEB(x2, 0); GETGB(x1); @@ -446,7 +446,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x3B: INST_NAME("CMP Gd, Ed"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGD; GETED(0); @@ -454,7 +454,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x3C: INST_NAME("CMP AL, Ib"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); u8 = F8; UXTBw(x1, xRAX); if(u8) { @@ -466,7 +466,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x3D: INST_NAME("CMP EAX, Id"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); i64 = F32S; if(i64) { MOV64xw(x2, i64); @@ -655,7 +655,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin switch((nextop>>3)&7) { case 0: //ADD INST_NAME("ADD Eb, Ib"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEB(x1, 1); u8 = F8; emit_add8c(dyn, ninst, x1, u8, x2, x4); @@ -663,7 +663,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 1: //OR INST_NAME("OR Eb, Ib"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEB(x1, 1); u8 = F8; emit_or8c(dyn, ninst, x1, u8, x2, x4); @@ -672,7 +672,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 2: //ADC INST_NAME("ADC Eb, Ib"); READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEB(x1, 1); u8 = F8; emit_adc8c(dyn, ninst, x1, u8, x2, x4, x5); @@ -681,7 +681,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 3: //SBB INST_NAME("SBB Eb, Ib"); READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEB(x1, 1); u8 = F8; emit_sbb8c(dyn, ninst, x1, u8, x2, x4, x5); @@ -689,7 +689,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 4: //AND INST_NAME("AND Eb, Ib"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEB(x1, 1); u8 = F8; emit_and8c(dyn, ninst, x1, u8, x2, x4); @@ -697,7 +697,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 5: //SUB INST_NAME("SUB Eb, Ib"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEB(x1, 1); u8 = F8; emit_sub8c(dyn, ninst, x1, u8, x2, x4, x5); @@ -705,7 +705,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 6: //XOR INST_NAME("XOR Eb, Ib"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEB(x1, 1); u8 = F8; emit_xor8c(dyn, ninst, x1, u8, x2, x4); @@ -713,7 +713,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 7: //CMP INST_NAME("CMP Eb, Ib"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEB(x1, 1); u8 = F8; if(u8) { @@ -733,7 +733,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin switch((nextop>>3)&7) { case 0: //ADD if(opcode==0x81) {INST_NAME("ADD Ed, Id");} else {INST_NAME("ADD Ed, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETED((opcode==0x81)?4:1); if(opcode==0x81) i64 = F32S; else i64 = F8S; emit_add32c(dyn, ninst, rex, ed, i64, x3, x4, x5); @@ -741,7 +741,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 1: //OR if(opcode==0x81) {INST_NAME("OR Ed, Id");} else {INST_NAME("OR Ed, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETED((opcode==0x81)?4:1); if(opcode==0x81) i64 = F32S; else i64 = F8S; emit_or32c(dyn, ninst, rex, ed, i64, x3, x4); @@ -750,7 +750,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 2: //ADC if(opcode==0x81) {INST_NAME("ADC Ed, Id");} else {INST_NAME("ADC Ed, Ib");} READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETED((opcode==0x81)?4:1); if(opcode==0x81) i64 = F32S; else i64 = F8S; MOV64xw(x5, i64); @@ -760,7 +760,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 3: //SBB if(opcode==0x81) {INST_NAME("SBB Ed, Id");} else {INST_NAME("SBB Ed, Ib");} READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETED((opcode==0x81)?4:1); if(opcode==0x81) i64 = F32S; else i64 = F8S; MOV64xw(x5, i64); @@ -769,7 +769,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 4: //AND if(opcode==0x81) {INST_NAME("AND Ed, Id");} else {INST_NAME("AND Ed, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETED((opcode==0x81)?4:1); if(opcode==0x81) i64 = F32S; else i64 = F8S; emit_and32c(dyn, ninst, rex, ed, i64, x3, x4); @@ -777,7 +777,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 5: //SUB if(opcode==0x81) {INST_NAME("SUB Ed, Id");} else {INST_NAME("SUB Ed, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETED((opcode==0x81)?4:1); if(opcode==0x81) i64 = F32S; else i64 = F8S; emit_sub32c(dyn, ninst, rex, ed, i64, x3, x4, x5); @@ -785,7 +785,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 6: //XOR if(opcode==0x81) {INST_NAME("XOR Ed, Id");} else {INST_NAME("XOR Ed, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETED((opcode==0x81)?4:1); if(opcode==0x81) i64 = F32S; else i64 = F8S; emit_xor32c(dyn, ninst, rex, ed, i64, x3, x4); @@ -793,7 +793,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 7: //CMP if(opcode==0x81) {INST_NAME("CMP Ed, Id");} else {INST_NAME("CMP Ed, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETED((opcode==0x81)?4:1); if(opcode==0x81) i64 = F32S; else i64 = F8S; if(i64) { @@ -806,7 +806,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x84: INST_NAME("TEST Eb, Gb"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop=F8; GETEB(x1, 0); GETGB(x2); @@ -814,7 +814,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x85: INST_NAME("TEST Ed, Gd"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop=F8; GETGD; GETED(0); @@ -1151,7 +1151,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; default: INST_NAME("CMPSB"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETDIR(x3, 1); LDRB_U12(x1, xRSI, 0); LDRB_U12(x2, xRDI, 0); @@ -1164,7 +1164,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0xA8: INST_NAME("TEST AL, Ib"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); UXTBx(x1, xRAX); u8 = F8; MOV32w(x2, u8); @@ -1172,7 +1172,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0xA9: INST_NAME("TEST EAX, Id"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); i64 = F32S; MOV64xw(x2, i64); emit_test32(dyn, ninst, rex, xRAX, x2, x3, x4); @@ -1249,7 +1249,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; default: INST_NAME("SCASB"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETDIR(x3, 1); UBFXw(x1, xRAX, 0, 8); LDRB_U12(x2, xRDI, 0); @@ -1438,7 +1438,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 4: case 6: INST_NAME("SHL Ed, Ib"); - SETFLAGS(X_ALL, SF_SET); // some flags are left undefined + SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined GETED(1); u8 = (F8)&(rex.w?0x3f:0x1f); emit_shl32c(dyn, ninst, rex, ed, u8, x3, x4); @@ -1446,7 +1446,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 5: INST_NAME("SHR Ed, Ib"); - SETFLAGS(X_ALL, SF_SET); // some flags are left undefined + SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined GETED(1); u8 = (F8)&(rex.w?0x3f:0x1f); emit_shr32c(dyn, ninst, rex, ed, u8, x3, x4); @@ -1456,7 +1456,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 7: INST_NAME("SAR Ed, Ib"); - SETFLAGS(X_ALL, SF_SET); // some flags are left undefined + SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined GETED(1); u8 = (F8)&(rex.w?0x3f:0x1f); emit_sar32c(dyn, ninst, rex, ed, u8, x3, x4); @@ -1717,21 +1717,21 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 4: case 6: INST_NAME("SHL Ed, 1"); - SETFLAGS(X_ALL, SF_SET); // some flags are left undefined + SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined GETED(0); emit_shl32c(dyn, ninst, rex, ed, 1, x3, x4); WBACK; break; case 5: INST_NAME("SHR Ed, 1"); - SETFLAGS(X_ALL, SF_SET); // some flags are left undefined + SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined GETED(0); emit_shr32c(dyn, ninst, rex, ed, 1, x3, x4); WBACK; break; case 7: INST_NAME("SAR Ed, 1"); - SETFLAGS(X_ALL, SF_SET); // some flags are left undefined + SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined GETED(0); emit_sar32c(dyn, ninst, rex, ed, 1, x3, x4); WBACK; @@ -1825,7 +1825,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 4: case 6: INST_NAME("SHL Ed, CL"); - SETFLAGS(X_ALL, SF_SET); // some flags are left undefined + SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined if(rex.w) { ANDSx_mask(x3, xRCX, 1, 0, 0b00101); //mask=0x000000000000003f } else { @@ -1839,7 +1839,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 5: INST_NAME("SHR Ed, CL"); - SETFLAGS(X_ALL, SF_SET); // some flags are left undefined + SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined if(rex.w) { ANDSx_mask(x3, xRCX, 1, 0, 0b00101); //mask=0x000000000000003f } else { @@ -2054,7 +2054,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0: case 1: INST_NAME("TEST Eb, Ib"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEB(x1, 1); u8 = F8; MOV32w(x2, u8); @@ -2068,7 +2068,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 3: INST_NAME("NEG Eb"); - SETFLAGS(X_ALL, SF_PENDING); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEB(x1, 0); emit_neg8(dyn, ninst, x1, x2, x4); EBBACK; @@ -2113,7 +2113,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0: case 1: INST_NAME("TEST Ed, Id"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEDH(x1, 4); i64 = F32S; MOV64xw(x2, i64); @@ -2127,7 +2127,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 3: INST_NAME("NEG Ed"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETED(0); emit_neg32(dyn, ninst, rex, ed, x3, x4); WBACK; diff --git a/src/dynarec/dynarec_arm64_64.c b/src/dynarec/dynarec_arm64_64.c index 546c5ff8..2fab3ee3 100644 --- a/src/dynarec/dynarec_arm64_64.c +++ b/src/dynarec/dynarec_arm64_64.c @@ -62,7 +62,7 @@ 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); + SETFLAGS(X_ALL, SF_SET_PENDING); grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; GETGD; @@ -158,7 +158,7 @@ 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); + SETFLAGS(X_ALL, SF_SET_PENDING); grab_segdata(dyn, addr, ninst, x4, seg); nextop = F8; GETGD; @@ -172,7 +172,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"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEBO(x1, 1); u8 = F8; emit_add8c(dyn, ninst, x1, u8, x2, x4); @@ -180,7 +180,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"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEBO(x1, 1); u8 = F8; emit_or8c(dyn, ninst, x1, u8, x2, x4); @@ -189,7 +189,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 2: //ADC INST_NAME("ADC Eb, Ib"); READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEBO(x1, 1); u8 = F8; emit_adc8c(dyn, ninst, x1, u8, x2, x4, x5); @@ -198,7 +198,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 3: //SBB INST_NAME("SBB Eb, Ib"); READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEBO(x1, 1); u8 = F8; emit_sbb8c(dyn, ninst, x1, u8, x2, x4, x5); @@ -206,7 +206,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"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEBO(x1, 1); u8 = F8; emit_and8c(dyn, ninst, x1, u8, x2, x4); @@ -214,7 +214,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"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEBO(x1, 1); u8 = F8; emit_sub8c(dyn, ninst, x1, u8, x2, x4, x5); @@ -222,7 +222,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"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEBO(x1, 1); u8 = F8; emit_xor8c(dyn, ninst, x1, u8, x2, x4); @@ -230,7 +230,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"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEBO(x1, 1); u8 = F8; if(u8) { @@ -251,7 +251,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin switch((nextop>>3)&7) { case 0: //ADD if(opcode==0x81) {INST_NAME("ADD Ed, Id");} else {INST_NAME("ADD Ed, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEDO(x6, (opcode==0x81)?4:1); if(opcode==0x81) i64 = F32S; else i64 = F8S; emit_add32c(dyn, ninst, rex, ed, i64, x3, x4, x5); @@ -259,7 +259,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 1: //OR if(opcode==0x81) {INST_NAME("OR Ed, Id");} else {INST_NAME("OR Ed, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEDO(x6, (opcode==0x81)?4:1); if(opcode==0x81) i64 = F32S; else i64 = F8S; emit_or32c(dyn, ninst, rex, ed, i64, x3, x4); @@ -268,7 +268,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 2: //ADC if(opcode==0x81) {INST_NAME("ADC Ed, Id");} else {INST_NAME("ADC Ed, Ib");} READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEDO(x6, (opcode==0x81)?4:1); if(opcode==0x81) i64 = F32S; else i64 = F8S; MOV64xw(x5, i64); @@ -278,7 +278,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 3: //SBB if(opcode==0x81) {INST_NAME("SBB Ed, Id");} else {INST_NAME("SBB Ed, Ib");} READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEDO(x6, (opcode==0x81)?4:1); if(opcode==0x81) i64 = F32S; else i64 = F8S; MOV64xw(x5, i64); @@ -287,7 +287,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 4: //AND if(opcode==0x81) {INST_NAME("AND Ed, Id");} else {INST_NAME("AND Ed, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEDO(x6, (opcode==0x81)?4:1); if(opcode==0x81) i64 = F32S; else i64 = F8S; emit_and32c(dyn, ninst, rex, ed, i64, x3, x4); @@ -295,7 +295,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 5: //SUB if(opcode==0x81) {INST_NAME("SUB Ed, Id");} else {INST_NAME("SUB Ed, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEDO(x6, (opcode==0x81)?4:1); if(opcode==0x81) i64 = F32S; else i64 = F8S; emit_sub32c(dyn, ninst, rex, ed, i64, x3, x4, x5); @@ -303,7 +303,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 6: //XOR if(opcode==0x81) {INST_NAME("XOR Ed, Id");} else {INST_NAME("XOR Ed, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEDO(x6, (opcode==0x81)?4:1); if(opcode==0x81) i64 = F32S; else i64 = F8S; emit_xor32c(dyn, ninst, rex, ed, i64, x3, x4); @@ -311,7 +311,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 7: //CMP if(opcode==0x81) {INST_NAME("CMP Ed, Id");} else {INST_NAME("CMP Ed, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEDO(x6, (opcode==0x81)?4:1); if(opcode==0x81) i64 = F32S; else i64 = F8S; if(i64) { diff --git a/src/dynarec/dynarec_arm64_66.c b/src/dynarec/dynarec_arm64_66.c index f5ca99da..e5429363 100755 --- a/src/dynarec/dynarec_arm64_66.c +++ b/src/dynarec/dynarec_arm64_66.c @@ -60,7 +60,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin switch(opcode) { case 0x01: INST_NAME("ADD Ew, Gw"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGW(x2); GETEW(x1, 0); @@ -69,7 +69,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x03: INST_NAME("ADD Gw, Ew"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGW(x1); GETEW(x2, 0); @@ -78,7 +78,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x05: INST_NAME("ADD AX, Iw"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); i32 = F16; UXTHw(x1, xRAX); MOV32w(x2, i32); @@ -88,7 +88,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x09: INST_NAME("OR Ew, Gw"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGW(x2); GETEW(x1, 0); @@ -97,7 +97,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x0B: INST_NAME("OR Gw, Ew"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGW(x1); GETEW(x2, 0); @@ -106,7 +106,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x0D: INST_NAME("OR AX, Iw"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); i32 = F16; UXTHw(x1, xRAX); MOV32w(x2, i32); @@ -120,7 +120,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x11: INST_NAME("ADC Ew, Gw"); READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGW(x2); GETEW(x1, 0); @@ -130,7 +130,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x13: INST_NAME("ADC Gw, Ew"); READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGW(x1); GETEW(x2, 0); @@ -140,7 +140,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x15: INST_NAME("ADC AX, Iw"); READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); i32 = F16; UXTHw(x1, xRAX); MOV32w(x2, i32); @@ -151,7 +151,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x19: INST_NAME("SBB Ew, Gw"); READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGW(x2); GETEW(x1, 0); @@ -161,7 +161,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x1B: INST_NAME("SBB Gw, Ew"); READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGW(x1); GETEW(x2, 0); @@ -171,7 +171,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x1D: INST_NAME("SBB AX, Iw"); READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); i16 = F16; UXTHw(x1, xRAX); MOV32w(x2, i16); @@ -181,7 +181,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x21: INST_NAME("AND Ew, Gw"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGW(x2); GETEW(x1, 0); @@ -190,7 +190,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x23: INST_NAME("AND Gw, Ew"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGW(x1); GETEW(x2, 0); @@ -199,7 +199,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x25: INST_NAME("AND AX, Iw"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); i32 = F16; UXTHw(x1, xRAX); MOV32w(x2, i32); @@ -209,7 +209,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x29: INST_NAME("SUB Ew, Gw"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGW(x2); GETEW(x1, 0); @@ -218,7 +218,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x2B: INST_NAME("SUB Gw, Ew"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGW(x1); GETEW(x2, 0); @@ -227,7 +227,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x2D: INST_NAME("SUB AX, Iw"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); i32 = F16; UXTHw(x1, xRAX); MOV32w(x2, i32); @@ -237,7 +237,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x31: INST_NAME("XOR Ew, Gw"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGW(x2); GETEW(x1, 0); @@ -246,7 +246,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x33: INST_NAME("XOR Gw, Ew"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGW(x1); GETEW(x2, 0); @@ -255,7 +255,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x35: INST_NAME("XOR AX, Iw"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); i32 = F16; UXTHw(x1, xRAX); MOV32w(x2, i32); @@ -265,7 +265,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x39: INST_NAME("CMP Ew, Gw"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGW(x2); GETEW(x1, 0); @@ -273,7 +273,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x3B: INST_NAME("CMP Gw, Ew"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGW(x1); GETEW(x2, 0); @@ -281,7 +281,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x3D: INST_NAME("CMP AX, Iw"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); i32 = F16; UXTHw(x1, xRAX); if(i32) { @@ -338,7 +338,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } else { INST_NAME("ADD Ew, Ib"); } - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEW(x1, (opcode==0x81)?2:1); if(opcode==0x81) i16 = F16S; else i16 = F8S; MOV32w(x5, i16); @@ -347,7 +347,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 1: //OR if(opcode==0x81) {INST_NAME("OR Ew, Iw");} else {INST_NAME("OR Ew, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEW(x1, (opcode==0x81)?2:1); if(opcode==0x81) i16 = F16S; else i16 = F8S; MOV32w(x5, i16); @@ -357,7 +357,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 2: //ADC if(opcode==0x81) {INST_NAME("ADC Ew, Iw");} else {INST_NAME("ADC Ew, Ib");} READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEW(x1, (opcode==0x81)?2:1); if(opcode==0x81) i16 = F16S; else i16 = F8S; MOV32w(x5, i16); @@ -367,7 +367,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 3: //SBB if(opcode==0x81) {INST_NAME("SBB Ew, Iw");} else {INST_NAME("SBB Ew, Ib");} READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEW(x1, (opcode==0x81)?2:1); if(opcode==0x81) i16 = F16S; else i16 = F8S; MOV32w(x5, i16); @@ -376,7 +376,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 4: //AND if(opcode==0x81) {INST_NAME("AND Ew, Iw");} else {INST_NAME("AND Ew, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEW(x1, (opcode==0x81)?2:1); if(opcode==0x81) i16 = F16S; else i16 = F8S; MOV32w(x5, i16); @@ -385,7 +385,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 5: //SUB if(opcode==0x81) {INST_NAME("SUB Ew, Iw");} else {INST_NAME("SUB Ew, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEW(x1, (opcode==0x81)?2:1); if(opcode==0x81) i16 = F16S; else i16 = F8S; MOV32w(x5, i16); @@ -394,7 +394,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 6: //XOR if(opcode==0x81) {INST_NAME("XOR Ew, Iw");} else {INST_NAME("XOR Ew, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEW(x1, (opcode==0x81)?2:1); if(opcode==0x81) i16 = F16S; else i16 = F8S; MOV32w(x5, i16); @@ -403,7 +403,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 7: //CMP if(opcode==0x81) {INST_NAME("CMP Ew, Iw");} else {INST_NAME("CMP Ew, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEW(x1, (opcode==0x81)?2:1); if(opcode==0x81) i16 = F16S; else i16 = F8S; if(i16) { @@ -417,7 +417,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x85: INST_NAME("TEST Ew, Gw"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETEW(x1, 0); GETGW(x2); @@ -502,7 +502,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0xA9: INST_NAME("TEST AX,Iw"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); u16 = F16; MOV32w(x2, u16); UBFXx(x1, xRAX, 0, 16); @@ -750,7 +750,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0: case 1: INST_NAME("TEST Ew, Iw"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEW(x1, 2); u16 = F16; MOV32w(x2, u16); @@ -764,7 +764,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 3: INST_NAME("NEG Ew"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEW(x1, 0); emit_neg16(dyn, ninst, ed, x2, x4); EWBACK; diff --git a/src/dynarec/dynarec_arm64_f0.c b/src/dynarec/dynarec_arm64_f0.c index 9225e283..4cf6a230 100644 --- a/src/dynarec/dynarec_arm64_f0.c +++ b/src/dynarec/dynarec_arm64_f0.c @@ -54,7 +54,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin switch(opcode) { case 0x00: INST_NAME("LOCK ADD Eb, Gb"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGB(x2); if((nextop&0xC0)==0xC0) { @@ -80,7 +80,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x01: INST_NAME("LOCK ADD Ed, Gd"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGD; if((nextop&0xC0)==0xC0) { @@ -102,7 +102,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0xB1: INST_NAME("LOCK CMPXCHG Ed, Gd"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGD; if(MODREG) { @@ -149,7 +149,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0xC1: INST_NAME("LOCK XADD Gd, Ed"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGD; if(MODREG) { @@ -187,7 +187,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0xC7: INST_NAME("LOCK CMPXCHG8B Gq, Eq"); - SETFLAGS(X_ZF, SF_SET); + SETFLAGS(X_ZF, SF_SUBSET); nextop = F8; addr = geted(dyn, addr, ninst, nextop, &wback, x1, &fixedaddress, 0, 0, rex, 0, 0); MARKLOCK; @@ -215,7 +215,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x29: INST_NAME("LOCK SUB Ed, Gd"); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); nextop = F8; GETGD; if(MODREG) { @@ -244,7 +244,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } else { INST_NAME("LOCK ADD Ew, Iw"); } - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); if(MODREG) { if(opcode==0x81) i32 = F16S; else i32 = F8S; ed = xRAX+(nextop&7)+(rex.b<<3); @@ -276,7 +276,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 1: //OR if(opcode==0x81) {INST_NAME("LOCK OR Ew, Iw");} else {INST_NAME("LOCK OR Ew, Iw");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); if(MODREG) { if(opcode==0x81) i32 = F16S; else i32 = F8S; ed = xRAX+(nextop&7)+(rex.b<<3); @@ -298,7 +298,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 2: //ADC if(opcode==0x81) {INST_NAME("LOCK ADC Ew, Iw");} else {INST_NAME("LOCK ADC Ew, Ib");} READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); if(MODREG) { if(opcode==0x81) i32 = F16S; else i32 = F8S; ed = xRAX+(nextop&7)+(rex.b<<3); @@ -320,7 +320,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 3: //SBB if(opcode==0x81) {INST_NAME("LOCK SBB Ew, Iw");} else {INST_NAME("LOCK SBB Ew, Ib");} READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); if(MODREG) { if(opcode==0x81) i32 = F16S; else i32 = F8S; ed = xRAX+(nextop&7)+(rex.b<<3); @@ -341,7 +341,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 4: //AND if(opcode==0x81) {INST_NAME("LOCK AND Ew, Iw");} else {INST_NAME("LOCK AND Ew, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); if(MODREG) { if(opcode==0x81) i32 = F16S; else i32 = F8S; ed = xRAX+(nextop&7)+(rex.b<<3); @@ -362,7 +362,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 5: //SUB if(opcode==0x81) {INST_NAME("LOCK SUB Ew, Iw");} else {INST_NAME("LOCK SUB Ew, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); if(MODREG) { if(opcode==0x81) i32 = F16S; else i32 = F8S; ed = xRAX+(nextop&7)+(rex.b<<3); @@ -394,7 +394,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 6: //XOR if(opcode==0x81) {INST_NAME("LOCK XOR Ew, Iw");} else {INST_NAME("LOCK XOR Ew, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); if(MODREG) { if(opcode==0x81) i32 = F16S; else i32 = F8S; ed = xRAX+(nextop&7)+(rex.b<<3); @@ -415,7 +415,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 7: //CMP if(opcode==0x81) {INST_NAME("(LOCK) CMP Ew, Iw");} else {INST_NAME("(LOCK) CMP Ew, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETEW(x6, (opcode==0x81)?2:1); (void)wb1; // No need to LOCK, this is readonly @@ -446,7 +446,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } else { INST_NAME("LOCK ADD Ed, Ib"); } - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); if(MODREG) { if(opcode==0x81) i64 = F32S; else i64 = F8S; ed = xRAX+(nextop&7)+(rex.b<<3); @@ -476,7 +476,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 1: //OR if(opcode==0x81) {INST_NAME("LOCK OR Ed, Id");} else {INST_NAME("LOCK OR Ed, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); if(MODREG) { if(opcode==0x81) i64 = F32S; else i64 = F8S; ed = xRAX+(nextop&7)+(rex.b<<3); @@ -496,7 +496,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 2: //ADC if(opcode==0x81) {INST_NAME("LOCK ADC Ed, Id");} else {INST_NAME("LOCK ADC Ed, Ib");} READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); if(MODREG) { if(opcode==0x81) i64 = F32S; else i64 = F8S; ed = xRAX+(nextop&7)+(rex.b<<3); @@ -516,7 +516,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 3: //SBB if(opcode==0x81) {INST_NAME("LOCK SBB Ed, Id");} else {INST_NAME("LOCK SBB Ed, Ib");} READFLAGS(X_CF); - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); if(MODREG) { if(opcode==0x81) i64 = F32S; else i64 = F8S; ed = xRAX+(nextop&7)+(rex.b<<3); @@ -535,7 +535,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 4: //AND if(opcode==0x81) {INST_NAME("LOCK AND Ed, Id");} else {INST_NAME("LOCK AND Ed, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); if(MODREG) { if(opcode==0x81) i64 = F32S; else i64 = F8S; ed = xRAX+(nextop&7)+(rex.b<<3); @@ -554,7 +554,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 5: //SUB if(opcode==0x81) {INST_NAME("LOCK SUB Ed, Id");} else {INST_NAME("LOCK SUB Ed, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); if(MODREG) { if(opcode==0x81) i64 = F32S; else i64 = F8S; ed = xRAX+(nextop&7)+(rex.b<<3); @@ -584,7 +584,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 6: //XOR if(opcode==0x81) {INST_NAME("LOCK XOR Ed, Id");} else {INST_NAME("LOCK XOR Ed, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); if(MODREG) { if(opcode==0x81) i64 = F32S; else i64 = F8S; ed = xRAX+(nextop&7)+(rex.b<<3); @@ -603,7 +603,7 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 7: //CMP if(opcode==0x81) {INST_NAME("(LOCK) CMP Ed, Id");} else {INST_NAME("(LOCK) CMP Ed, Ib");} - SETFLAGS(X_ALL, SF_SET); + SETFLAGS(X_ALL, SF_SET_PENDING); GETED((opcode==0x81)?4:1); // No need to LOCK, this is readonly if(opcode==0x81) i64 = F32S; else i64 = F8S; diff --git a/src/dynarec/dynarec_arm64_helper.h b/src/dynarec/dynarec_arm64_helper.h index ec9ca63c..617524b4 100755 --- a/src/dynarec/dynarec_arm64_helper.h +++ b/src/dynarec/dynarec_arm64_helper.h @@ -496,7 +496,7 @@ #ifndef READFLAGS #define READFLAGS(A) \ - if(((A)!=X_PEND) && dyn->state_flags!=SF_SET) { \ + if(((A)!=X_PEND) && dyn->state_flags!=SF_SET && dyn->state_flags!=SF_SET_PENDING) { \ if(dyn->state_flags!=SF_PENDING) { \ LDRw_U12(x3, xEmu, offsetof(x64emu_t, df)); \ j64 = (GETMARKF)-(dyn->arm_size); \ @@ -510,9 +510,11 @@ #endif #ifndef SETFLAGS #define SETFLAGS(A, B) \ - if(dyn->state_flags!=SF_SET && B==SF_SUBSET && (dyn->insts[ninst].x64.need_flags&(~((A)|X_PEND)))) \ - READFLAGS(dyn->insts[ninst].x64.need_flags&(~(A))); \ - dyn->state_flags = (B==SF_SUBSET)?SF_SET:B + if(dyn->state_flags!=SF_SET && B==SF_SUBSET && (dyn->insts[ninst].x64.need_flags&(~((A)/*|X_PEND*/)))) \ + READFLAGS(dyn->insts[ninst].x64.need_flags&(~(A)|X_PEND)); \ + dyn->state_flags = (B==SF_SUBSET)?SF_SET: \ + ((B==SF_SET_PENDING && !(dyn->insts[ninst].x64.need_flags&X_PEND)?SF_SET:B)) + #endif #ifndef JUMP #define JUMP(A) diff --git a/src/dynarec/dynarec_private.h b/src/dynarec/dynarec_private.h index 66eb3bfa..f6800148 100755 --- a/src/dynarec/dynarec_private.h +++ b/src/dynarec/dynarec_private.h @@ -15,8 +15,9 @@ #define SF_UNKNOWN 0 #define SF_SET 1 #define SF_PENDING 2 -#define SF_MAYSET 3 -#define SF_SUBSET 4 +#define SF_SET_PENDING 3 +#define SF_MAYSET 4 +#define SF_SUBSET 5 typedef struct instruction_x64_s { uintptr_t addr; //address of the instruction -- cgit 1.4.1