Revision f631ef9b op-i386.c

b/op-i386.c
611 611
    }
612 612
}
613 613

  
614
/* XXX: add IOPL/CPL tests */
615
void OPPROTO op_cli(void)
616
{
617
    raise_exception(EXCP0D_GPF);
618
}
619

  
620
/* XXX: add IOPL/CPL tests */
621
void OPPROTO op_sti(void)
622
{
623
    raise_exception(EXCP0D_GPF);
624
}
625

  
626
/* vm86plus instructions */
627

  
628
void OPPROTO op_cli_vm(void)
629
{
630
    env->eflags &= ~VIF_MASK;
631
}
632

  
633
void OPPROTO op_sti_vm(void)
634
{
635
    env->eflags |= VIF_MASK;
636
    if (env->eflags & VIP_MASK) {
637
        EIP = PARAM1;
638
        raise_exception(EXCP0D_GPF);
639
    }
640
    FORCE_RET();
641
}
642

  
614 643
void OPPROTO op_boundw(void)
615 644
{
616 645
    int low, high, v;
......
1234 1263
    CC_OP = PARAM1;
1235 1264
}
1236 1265

  
1237
#define FL_UPDATE_MASK (TF_MASK | AC_MASK | ID_MASK)
1266
#define FL_UPDATE_MASK32 (TF_MASK | AC_MASK | ID_MASK)
1267
#define FL_UPDATE_MASK16 (TF_MASK)
1238 1268

  
1239 1269
void OPPROTO op_movl_eflags_T0(void)
1240 1270
{
......
1243 1273
    CC_SRC = eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
1244 1274
    DF = 1 - (2 * ((eflags >> 10) & 1));
1245 1275
    /* we also update some system flags as in user mode */
1246
    env->eflags = (env->eflags & ~FL_UPDATE_MASK) | (eflags & FL_UPDATE_MASK);
1276
    env->eflags = (env->eflags & ~FL_UPDATE_MASK32) | (eflags & FL_UPDATE_MASK32);
1277
}
1278

  
1279
void OPPROTO op_movw_eflags_T0(void)
1280
{
1281
    int eflags;
1282
    eflags = T0;
1283
    CC_SRC = eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
1284
    DF = 1 - (2 * ((eflags >> 10) & 1));
1285
    /* we also update some system flags as in user mode */
1286
    env->eflags = (env->eflags & ~FL_UPDATE_MASK16) | (eflags & FL_UPDATE_MASK16);
1287
}
1288

  
1289
/* vm86 version */
1290
void OPPROTO op_movw_eflags_T0_vm(void)
1291
{
1292
    int eflags;
1293
    eflags = T0;
1294
    CC_SRC = eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
1295
    DF = 1 - (2 * ((eflags >> 10) & 1));
1296
    /* we also update some system flags as in user mode */
1297
    env->eflags = (env->eflags & ~(FL_UPDATE_MASK16 | VIF_MASK)) |
1298
        (eflags & FL_UPDATE_MASK16);
1299
    if (eflags & IF_MASK) {
1300
        env->eflags |= VIF_MASK;
1301
        if (env->eflags & VIP_MASK) {
1302
            EIP = PARAM1;
1303
            raise_exception(EXCP0D_GPF);
1304
        }
1305
    }
1306
    FORCE_RET();
1307
}
1308

  
1309
void OPPROTO op_movl_eflags_T0_vm(void)
1310
{
1311
    int eflags;
1312
    eflags = T0;
1313
    CC_SRC = eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
1314
    DF = 1 - (2 * ((eflags >> 10) & 1));
1315
    /* we also update some system flags as in user mode */
1316
    env->eflags = (env->eflags & ~(FL_UPDATE_MASK32 | VIF_MASK)) |
1317
        (eflags & FL_UPDATE_MASK32);
1318
    if (eflags & IF_MASK) {
1319
        env->eflags |= VIF_MASK;
1320
        if (env->eflags & VIP_MASK) {
1321
            EIP = PARAM1;
1322
            raise_exception(EXCP0D_GPF);
1323
        }
1324
    }
1325
    FORCE_RET();
1247 1326
}
1248 1327

  
1249 1328
/* XXX: compute only O flag */
......
1263 1342
    T0 = eflags;
1264 1343
}
1265 1344

  
1345
/* vm86 version */
1346
void OPPROTO op_movl_T0_eflags_vm(void)
1347
{
1348
    int eflags;
1349
    eflags = cc_table[CC_OP].compute_all();
1350
    eflags |= (DF & DF_MASK);
1351
    eflags |= env->eflags & ~(VM_MASK | RF_MASK | IF_MASK);
1352
    if (env->eflags & VIF_MASK)
1353
        eflags |= IF_MASK;
1354
    T0 = eflags;
1355
}
1356

  
1266 1357
void OPPROTO op_cld(void)
1267 1358
{
1268 1359
    DF = 1;
......
1377 1468
    [CC_OP_SARL] = { compute_all_sarl, compute_c_shll },
1378 1469
};
1379 1470

  
1380
/* floating point support */
1471
/* floating point support. Some of the code for complicated x87
1472
   functions comes from the LGPL'ed x86 emulator found in the Willows
1473
   TWIN windows emulator. */
1381 1474

  
1382 1475
#ifdef USE_X86LDOUBLE
1383 1476
/* use long double functions */

Also available in: Unified diff