Skip to content

Commit 6c504fb

Browse files
committed
simx86: use Gen for pm LDS/LES/LFS/LGS/LSS
needed a little change to A_SR_PROT to preserve %rdi between L_LXS2 and L_LXS1 (L_LXS1 has to go after: in case of exception we can't write to TheCPU registers unless it's all clear).
1 parent e93a317 commit 6c504fb

File tree

1 file changed

+20
-70
lines changed

1 file changed

+20
-70
lines changed

src/base/emu-i386/simx86/interp.c

Lines changed: 20 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1415,50 +1415,30 @@ intop3b: { int op = ArOpsFR[D_MO(opc)];
14151415
CODE_FLUSH();
14161416
goto illegal_op;
14171417
}
1418+
PC += ModRM(opc, PC, _mode);
1419+
Gen(L_LXS2, _mode);
14181420
if (REALADDR()) {
1419-
PC += ModRM(opc, PC, _mode);
1420-
Gen(L_LXS2, _mode);
14211421
AddrGen(A_SR_SH4, _mode, Ofs_ES, Ofs_XES);
1422-
Gen(L_LXS1, _mode, REG1);
14231422
}
14241423
else {
1425-
unsigned short sv = 0;
1426-
unsigned long rv;
1427-
CODE_FLUSH();
1428-
PC += ModRMSim(PC, _mode, OVERR_DS, OVERR_SS);
1429-
rv = DataGetWL_U(_mode,TheCPU.mem_ref);
1430-
TheCPU.mem_ref += BT24(BitDATA16, _mode);
1431-
sv = GetDWord(TheCPU.mem_ref);
1432-
TheCPU.err = MAKESEG(_mode, Ofs_ES, sv);
1433-
if (TheCPU.err) return P0;
1434-
SetCPU_WL(_mode, REG1, rv);
1435-
TheCPU.es = sv;
1424+
AddrGen(A_SR_PROT, _mode, Ofs_ES, P0);
14361425
}
1426+
Gen(L_LXS1, _mode, REG1);
14371427
break;
14381428
/*c5*/ case LDS:
14391429
if (Fetch(PC+1) >= 0xc0) {
14401430
CODE_FLUSH();
14411431
goto illegal_op;
14421432
}
1433+
PC += ModRM(opc, PC, _mode);
1434+
Gen(L_LXS2, _mode);
14431435
if (REALADDR()) {
1444-
PC += ModRM(opc, PC, _mode);
1445-
Gen(L_LXS2, _mode);
14461436
AddrGen(A_SR_SH4, _mode, Ofs_DS, Ofs_XDS);
1447-
Gen(L_LXS1, _mode, REG1);
14481437
}
14491438
else {
1450-
unsigned short sv = 0;
1451-
unsigned long rv;
1452-
CODE_FLUSH();
1453-
PC += ModRMSim(PC, _mode, OVERR_DS, OVERR_SS);
1454-
rv = DataGetWL_U(_mode,TheCPU.mem_ref);
1455-
TheCPU.mem_ref += BT24(BitDATA16, _mode);
1456-
sv = GetDWord(TheCPU.mem_ref);
1457-
TheCPU.err = MAKESEG(_mode, Ofs_DS, sv);
1458-
if (TheCPU.err) return P0;
1459-
SetCPU_WL(_mode, REG1, rv);
1460-
TheCPU.ds = sv;
1439+
AddrGen(A_SR_PROT, _mode, Ofs_DS, P0);
14611440
}
1441+
Gen(L_LXS1, _mode, REG1);
14621442
break;
14631443
/*8e*/ case MOVsrfrm:
14641444
PC += ModRM(opc, PC, _mode|SEGREG|DATA16|MLOAD);
@@ -3348,75 +3328,45 @@ intop3b: { int op = ArOpsFR[D_MO(opc)];
33483328
CODE_FLUSH();
33493329
goto illegal_op;
33503330
}
3331+
PC++; PC += ModRM(opc, PC, _mode);
3332+
Gen(L_LXS2, _mode);
33513333
if (REALADDR()) {
3352-
PC++; PC += ModRM(opc, PC, _mode);
3353-
Gen(L_LXS2, _mode);
33543334
AddrGen(A_SR_SH4, _mode, Ofs_SS, Ofs_XSS);
3355-
Gen(L_LXS1, _mode, REG1);
33563335
}
33573336
else {
3358-
unsigned short sv = 0;
3359-
unsigned long rv;
3360-
CODE_FLUSH();
3361-
PC++; PC += ModRMSim(PC, _mode, OVERR_DS, OVERR_SS);
3362-
rv = DataGetWL_U(_mode,TheCPU.mem_ref);
3363-
TheCPU.mem_ref += BT24(BitDATA16,_mode);
3364-
sv = GetDWord(TheCPU.mem_ref);
3365-
TheCPU.err = MAKESEG(_mode, Ofs_SS, sv);
3366-
if (TheCPU.err) return P0;
3367-
SetCPU_WL(_mode, REG1, rv);
3368-
TheCPU.ss = sv;
3337+
AddrGen(A_SR_PROT, _mode, Ofs_SS, P0);
33693338
}
3339+
Gen(L_LXS1, _mode, REG1);
33703340
break;
33713341
case 0xb4: /* LFS */
33723342
if (Fetch(PC+2) >= 0xc0) {
33733343
CODE_FLUSH();
33743344
goto illegal_op;
33753345
}
3346+
PC++; PC += ModRM(opc, PC, _mode);
3347+
Gen(L_LXS2, _mode);
33763348
if (REALADDR()) {
3377-
PC++; PC += ModRM(opc, PC, _mode);
3378-
Gen(L_LXS2, _mode);
33793349
AddrGen(A_SR_SH4, _mode, Ofs_FS, Ofs_XFS);
3380-
Gen(L_LXS1, _mode, REG1);
33813350
}
33823351
else {
3383-
unsigned short sv = 0;
3384-
unsigned long rv;
3385-
CODE_FLUSH();
3386-
PC++; PC += ModRMSim(PC, _mode, OVERR_DS, OVERR_SS);
3387-
rv = DataGetWL_U(_mode,TheCPU.mem_ref);
3388-
TheCPU.mem_ref += BT24(BitDATA16,_mode);
3389-
sv = GetDWord(TheCPU.mem_ref);
3390-
TheCPU.err = MAKESEG(_mode, Ofs_FS, sv);
3391-
if (TheCPU.err) return P0;
3392-
SetCPU_WL(_mode, REG1, rv);
3393-
TheCPU.fs = sv;
3352+
AddrGen(A_SR_PROT, _mode, Ofs_FS, P0);
33943353
}
3354+
Gen(L_LXS1, _mode, REG1);
33953355
break;
33963356
case 0xb5: /* LGS */
33973357
if (Fetch(PC+2) >= 0xc0) {
33983358
CODE_FLUSH();
33993359
goto illegal_op;
34003360
}
3361+
PC++; PC += ModRM(opc, PC, _mode);
3362+
Gen(L_LXS2, _mode);
34013363
if (REALADDR()) {
3402-
PC++; PC += ModRM(opc, PC, _mode);
3403-
Gen(L_LXS2, _mode);
34043364
AddrGen(A_SR_SH4, _mode, Ofs_GS, Ofs_XGS);
3405-
Gen(L_LXS1, _mode, REG1);
34063365
}
34073366
else {
3408-
unsigned short sv = 0;
3409-
unsigned long rv;
3410-
CODE_FLUSH();
3411-
PC++; PC += ModRMSim(PC, _mode, OVERR_DS, OVERR_SS);
3412-
rv = DataGetWL_U(_mode,TheCPU.mem_ref);
3413-
TheCPU.mem_ref += BT24(BitDATA16,_mode);
3414-
sv = GetDWord(TheCPU.mem_ref);
3415-
TheCPU.err = MAKESEG(_mode, Ofs_GS, sv);
3416-
if (TheCPU.err) return P0;
3417-
SetCPU_WL(_mode, REG1, rv);
3418-
TheCPU.gs = sv;
3367+
AddrGen(A_SR_PROT, _mode, Ofs_GS, P0);
34193368
}
3369+
Gen(L_LXS1, _mode, REG1);
34203370
break;
34213371
case 0xb6: /* MOVZXb */
34223372
PC++; PC += ModRM(opc, PC, _mode|MBYTX|MLOAD);

0 commit comments

Comments
 (0)