Revision bd7a7b33 target-i386/op.c

b/target-i386/op.c
255 255
{
256 256
    T0 ^= 1;
257 257
}
258

  
259
/* XXX: clear VIF/VIP in all ops ? */
260

  
261
void OPPROTO op_movl_eflags_T0(void)
262
{
263
    load_eflags(T0, (TF_MASK | AC_MASK | ID_MASK | NT_MASK));
264
}
265

  
266
void OPPROTO op_movw_eflags_T0(void)
267
{
268
    load_eflags(T0, (TF_MASK | AC_MASK | ID_MASK | NT_MASK) & 0xffff);
269
}
270

  
271
void OPPROTO op_movl_eflags_T0_io(void)
272
{
273
    load_eflags(T0, (TF_MASK | AC_MASK | ID_MASK | NT_MASK | IF_MASK));
274
}
275

  
276
void OPPROTO op_movw_eflags_T0_io(void)
277
{
278
    load_eflags(T0, (TF_MASK | AC_MASK | ID_MASK | NT_MASK | IF_MASK) & 0xffff);
279
}
280

  
281
void OPPROTO op_movl_eflags_T0_cpl0(void)
282
{
283
    load_eflags(T0, (TF_MASK | AC_MASK | ID_MASK | NT_MASK | IF_MASK | IOPL_MASK));
284
}
285

  
286
void OPPROTO op_movw_eflags_T0_cpl0(void)
287
{
288
    load_eflags(T0, (TF_MASK | AC_MASK | ID_MASK | NT_MASK | IF_MASK | IOPL_MASK) & 0xffff);
289
}
290

  
291
#if 0
292
/* vm86plus version */
293
void OPPROTO op_movw_eflags_T0_vm(void)
294
{
295
    int eflags;
296
    eflags = T0;
297
    CC_SRC = eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
298
    DF = 1 - (2 * ((eflags >> 10) & 1));
299
    /* we also update some system flags as in user mode */
300
    env->eflags = (env->eflags & ~(FL_UPDATE_MASK16 | VIF_MASK)) |
301
        (eflags & FL_UPDATE_MASK16);
302
    if (eflags & IF_MASK) {
303
        env->eflags |= VIF_MASK;
304
        if (env->eflags & VIP_MASK) {
305
            EIP = PARAM1;
306
            raise_exception(EXCP0D_GPF);
307
        }
308
    }
309
    FORCE_RET();
310
}
311

  
312
void OPPROTO op_movl_eflags_T0_vm(void)
313
{
314
    int eflags;
315
    eflags = T0;
316
    CC_SRC = eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
317
    DF = 1 - (2 * ((eflags >> 10) & 1));
318
    /* we also update some system flags as in user mode */
319
    env->eflags = (env->eflags & ~(FL_UPDATE_MASK32 | VIF_MASK)) |
320
        (eflags & FL_UPDATE_MASK32);
321
    if (eflags & IF_MASK) {
322
        env->eflags |= VIF_MASK;
323
        if (env->eflags & VIP_MASK) {
324
            EIP = PARAM1;
325
            raise_exception(EXCP0D_GPF);
326
        }
327
    }
328
    FORCE_RET();
329
}
330
#endif
331

  
332
/* XXX: compute only O flag */
333
void OPPROTO op_movb_eflags_T0(void)
334
{
335
    int of;
336
    of = cc_table[CC_OP].compute_all() & CC_O;
337
    CC_SRC = (T0 & (CC_S | CC_Z | CC_A | CC_P | CC_C)) | of;
338
}
339

  
340
void OPPROTO op_movl_T0_eflags(void)
341
{
342
    int eflags;
343
    eflags = cc_table[CC_OP].compute_all();
344
    eflags |= (DF & DF_MASK);
345
    eflags |= env->eflags & ~(VM_MASK | RF_MASK);
346
    T0 = eflags;
347
}
348

  
349
/* vm86plus version */
350
#if 0
351
void OPPROTO op_movl_T0_eflags_vm(void)
352
{
353
    int eflags;
354
    eflags = cc_table[CC_OP].compute_all();
355
    eflags |= (DF & DF_MASK);
356
    eflags |= env->eflags & ~(VM_MASK | RF_MASK | IF_MASK);
357
    if (env->eflags & VIF_MASK)
358
        eflags |= IF_MASK;
359
    T0 = eflags;
360
}
361
#endif
362

  
363
void OPPROTO op_clc(void)
364
{
365
    int eflags;
366
    eflags = cc_table[CC_OP].compute_all();
367
    eflags &= ~CC_C;
368
    CC_SRC = eflags;
369
}
370

  
371
void OPPROTO op_stc(void)
372
{
373
    int eflags;
374
    eflags = cc_table[CC_OP].compute_all();
375
    eflags |= CC_C;
376
    CC_SRC = eflags;
377
}
378

  
379
void OPPROTO op_cmc(void)
380
{
381
    int eflags;
382
    eflags = cc_table[CC_OP].compute_all();
383
    eflags ^= CC_C;
384
    CC_SRC = eflags;
385
}
386

  
387
void OPPROTO op_salc(void)
388
{
389
    int cf;
390
    cf = cc_table[CC_OP].compute_c();
391
    EAX = (EAX & ~0xff) | ((-cf) & 0xff);
392
}

Also available in: Unified diff