Revision 14ce26e7 target-i386/ops_template.h

b/target-i386/ops_template.h
20 20
 */
21 21
#define DATA_BITS (1 << (3 + SHIFT))
22 22
#define SHIFT_MASK (DATA_BITS - 1)
23
#define SIGN_MASK (1 << (DATA_BITS - 1))
23
#define SIGN_MASK (((target_ulong)1) << (DATA_BITS - 1))
24
#if DATA_BITS <= 32
25
#define SHIFT1_MASK 0x1f
26
#else
27
#define SHIFT1_MASK 0x3f
28
#endif
24 29

  
25 30
#if DATA_BITS == 8
26 31
#define SUFFIX b
......
37 42
#define DATA_TYPE uint32_t
38 43
#define DATA_STYPE int32_t
39 44
#define DATA_MASK 0xffffffff
45
#elif DATA_BITS == 64
46
#define SUFFIX q
47
#define DATA_TYPE uint64_t
48
#define DATA_STYPE int64_t
49
#define DATA_MASK 0xffffffffffffffff
40 50
#else
41 51
#error unhandled operand size
42 52
#endif
......
46 56
static int glue(compute_all_add, SUFFIX)(void)
47 57
{
48 58
    int cf, pf, af, zf, sf, of;
49
    int src1, src2;
59
    target_long src1, src2;
50 60
    src1 = CC_SRC;
51 61
    src2 = CC_DST - CC_SRC;
52 62
    cf = (DATA_TYPE)CC_DST < (DATA_TYPE)src1;
......
60 70

  
61 71
static int glue(compute_c_add, SUFFIX)(void)
62 72
{
63
    int src1, cf;
73
    int cf;
74
    target_long src1;
64 75
    src1 = CC_SRC;
65 76
    cf = (DATA_TYPE)CC_DST < (DATA_TYPE)src1;
66 77
    return cf;
......
69 80
static int glue(compute_all_adc, SUFFIX)(void)
70 81
{
71 82
    int cf, pf, af, zf, sf, of;
72
    int src1, src2;
83
    target_long src1, src2;
73 84
    src1 = CC_SRC;
74 85
    src2 = CC_DST - CC_SRC - 1;
75 86
    cf = (DATA_TYPE)CC_DST <= (DATA_TYPE)src1;
......
83 94

  
84 95
static int glue(compute_c_adc, SUFFIX)(void)
85 96
{
86
    int src1, cf;
97
    int cf;
98
    target_long src1;
87 99
    src1 = CC_SRC;
88 100
    cf = (DATA_TYPE)CC_DST <= (DATA_TYPE)src1;
89 101
    return cf;
......
92 104
static int glue(compute_all_sub, SUFFIX)(void)
93 105
{
94 106
    int cf, pf, af, zf, sf, of;
95
    int src1, src2;
107
    target_long src1, src2;
96 108
    src1 = CC_DST + CC_SRC;
97 109
    src2 = CC_SRC;
98 110
    cf = (DATA_TYPE)src1 < (DATA_TYPE)src2;
......
106 118

  
107 119
static int glue(compute_c_sub, SUFFIX)(void)
108 120
{
109
    int src1, src2, cf;
121
    int cf;
122
    target_long src1, src2;
110 123
    src1 = CC_DST + CC_SRC;
111 124
    src2 = CC_SRC;
112 125
    cf = (DATA_TYPE)src1 < (DATA_TYPE)src2;
......
116 129
static int glue(compute_all_sbb, SUFFIX)(void)
117 130
{
118 131
    int cf, pf, af, zf, sf, of;
119
    int src1, src2;
132
    target_long src1, src2;
120 133
    src1 = CC_DST + CC_SRC + 1;
121 134
    src2 = CC_SRC;
122 135
    cf = (DATA_TYPE)src1 <= (DATA_TYPE)src2;
......
130 143

  
131 144
static int glue(compute_c_sbb, SUFFIX)(void)
132 145
{
133
    int src1, src2, cf;
146
    int cf;
147
    target_long src1, src2;
134 148
    src1 = CC_DST + CC_SRC + 1;
135 149
    src2 = CC_SRC;
136 150
    cf = (DATA_TYPE)src1 <= (DATA_TYPE)src2;
......
157 171
static int glue(compute_all_inc, SUFFIX)(void)
158 172
{
159 173
    int cf, pf, af, zf, sf, of;
160
    int src1, src2;
174
    target_long src1, src2;
161 175
    src1 = CC_DST - 1;
162 176
    src2 = 1;
163 177
    cf = CC_SRC;
......
179 193
static int glue(compute_all_dec, SUFFIX)(void)
180 194
{
181 195
    int cf, pf, af, zf, sf, of;
182
    int src1, src2;
196
    target_long src1, src2;
183 197
    src1 = CC_DST + 1;
184 198
    src2 = 1;
185 199
    cf = CC_SRC;
......
187 201
    af = (CC_DST ^ src1 ^ src2) & 0x10;
188 202
    zf = ((DATA_TYPE)CC_DST == 0) << 6;
189 203
    sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80;
190
    of = ((CC_DST & DATA_MASK) == ((uint32_t)SIGN_MASK - 1)) << 11;
204
    of = ((CC_DST & DATA_MASK) == ((target_ulong)SIGN_MASK - 1)) << 11;
191 205
    return cf | pf | af | zf | sf | of;
192 206
}
193 207

  
......
256 270

  
257 271
void OPPROTO glue(op_jb_sub, SUFFIX)(void)
258 272
{
259
    int src1, src2;
273
    target_long src1, src2;
260 274
    src1 = CC_DST + CC_SRC;
261 275
    src2 = CC_SRC;
262 276

  
263 277
    if ((DATA_TYPE)src1 < (DATA_TYPE)src2)
264
        JUMP_TB(glue(op_jb_sub, SUFFIX), PARAM1, 0, PARAM2);
265
    else
266
        JUMP_TB(glue(op_jb_sub, SUFFIX), PARAM1, 1, PARAM3);
278
        GOTO_LABEL_PARAM(1);
267 279
    FORCE_RET();
268 280
}
269 281

  
270 282
void OPPROTO glue(op_jz_sub, SUFFIX)(void)
271 283
{
272 284
    if ((DATA_TYPE)CC_DST == 0)
273
        JUMP_TB(glue(op_jz_sub, SUFFIX), PARAM1, 0, PARAM2);
274
    else
275
        JUMP_TB(glue(op_jz_sub, SUFFIX), PARAM1, 1, PARAM3);
285
        GOTO_LABEL_PARAM(1);
286
    FORCE_RET();
287
}
288

  
289
void OPPROTO glue(op_jnz_sub, SUFFIX)(void)
290
{
291
    if ((DATA_TYPE)CC_DST != 0)
292
        GOTO_LABEL_PARAM(1);
276 293
    FORCE_RET();
277 294
}
278 295

  
279 296
void OPPROTO glue(op_jbe_sub, SUFFIX)(void)
280 297
{
281
    int src1, src2;
298
    target_long src1, src2;
282 299
    src1 = CC_DST + CC_SRC;
283 300
    src2 = CC_SRC;
284 301

  
285 302
    if ((DATA_TYPE)src1 <= (DATA_TYPE)src2)
286
        JUMP_TB(glue(op_jbe_sub, SUFFIX), PARAM1, 0, PARAM2);
287
    else
288
        JUMP_TB(glue(op_jbe_sub, SUFFIX), PARAM1, 1, PARAM3);
303
        GOTO_LABEL_PARAM(1);
289 304
    FORCE_RET();
290 305
}
291 306

  
292 307
void OPPROTO glue(op_js_sub, SUFFIX)(void)
293 308
{
294 309
    if (CC_DST & SIGN_MASK)
295
        JUMP_TB(glue(op_js_sub, SUFFIX), PARAM1, 0, PARAM2);
296
    else
297
        JUMP_TB(glue(op_js_sub, SUFFIX), PARAM1, 1, PARAM3);
310
        GOTO_LABEL_PARAM(1);
298 311
    FORCE_RET();
299 312
}
300 313

  
301 314
void OPPROTO glue(op_jl_sub, SUFFIX)(void)
302 315
{
303
    int src1, src2;
316
    target_long src1, src2;
304 317
    src1 = CC_DST + CC_SRC;
305 318
    src2 = CC_SRC;
306 319

  
307 320
    if ((DATA_STYPE)src1 < (DATA_STYPE)src2)
308
        JUMP_TB(glue(op_jl_sub, SUFFIX), PARAM1, 0, PARAM2);
309
    else
310
        JUMP_TB(glue(op_jl_sub, SUFFIX), PARAM1, 1, PARAM3);
321
        GOTO_LABEL_PARAM(1);
311 322
    FORCE_RET();
312 323
}
313 324

  
314 325
void OPPROTO glue(op_jle_sub, SUFFIX)(void)
315 326
{
316
    int src1, src2;
327
    target_long src1, src2;
317 328
    src1 = CC_DST + CC_SRC;
318 329
    src2 = CC_SRC;
319 330

  
320 331
    if ((DATA_STYPE)src1 <= (DATA_STYPE)src2)
321
        JUMP_TB(glue(op_jle_sub, SUFFIX), PARAM1, 0, PARAM2);
322
    else
323
        JUMP_TB(glue(op_jle_sub, SUFFIX), PARAM1, 1, PARAM3);
332
        GOTO_LABEL_PARAM(1);
324 333
    FORCE_RET();
325 334
}
326 335

  
......
330 339

  
331 340
void OPPROTO glue(op_loopnz, SUFFIX)(void)
332 341
{
333
    unsigned int tmp;
334 342
    int eflags;
335 343
    eflags = cc_table[CC_OP].compute_all();
336
    tmp = (ECX - 1) & DATA_MASK;
337
    ECX = (ECX & ~DATA_MASK) | tmp;
338
    if (tmp != 0 && !(eflags & CC_Z))
339
        EIP = PARAM1;
340
    else
341
        EIP = PARAM2;
344
    if ((DATA_TYPE)ECX != 0 && !(eflags & CC_Z))
345
        GOTO_LABEL_PARAM(1);
342 346
    FORCE_RET();
343 347
}
344 348

  
345 349
void OPPROTO glue(op_loopz, SUFFIX)(void)
346 350
{
347
    unsigned int tmp;
348 351
    int eflags;
349 352
    eflags = cc_table[CC_OP].compute_all();
350
    tmp = (ECX - 1) & DATA_MASK;
351
    ECX = (ECX & ~DATA_MASK) | tmp;
352
    if (tmp != 0 && (eflags & CC_Z))
353
        EIP = PARAM1;
354
    else
355
        EIP = PARAM2;
353
    if ((DATA_TYPE)ECX != 0 && (eflags & CC_Z))
354
        GOTO_LABEL_PARAM(1);
356 355
    FORCE_RET();
357 356
}
358 357

  
359
void OPPROTO glue(op_loop, SUFFIX)(void)
358
void OPPROTO glue(op_jz_ecx, SUFFIX)(void)
360 359
{
361
    unsigned int tmp;
362
    tmp = (ECX - 1) & DATA_MASK;
363
    ECX = (ECX & ~DATA_MASK) | tmp;
364
    if (tmp != 0)
365
        EIP = PARAM1;
366
    else
367
        EIP = PARAM2;
360
    if ((DATA_TYPE)ECX == 0)
361
        GOTO_LABEL_PARAM(1);
368 362
    FORCE_RET();
369 363
}
370 364

  
371
void OPPROTO glue(op_jecxz, SUFFIX)(void)
365
void OPPROTO glue(op_jnz_ecx, SUFFIX)(void)
372 366
{
373
    if ((DATA_TYPE)ECX == 0)
374
        EIP = PARAM1;
375
    else
376
        EIP = PARAM2;
367
    if ((DATA_TYPE)ECX != 0)
368
        GOTO_LABEL_PARAM(1);
377 369
    FORCE_RET();
378 370
}
379 371

  
......
383 375

  
384 376
void OPPROTO glue(op_setb_T0_sub, SUFFIX)(void)
385 377
{
386
    int src1, src2;
378
    target_long src1, src2;
387 379
    src1 = CC_DST + CC_SRC;
388 380
    src2 = CC_SRC;
389 381

  
......
397 389

  
398 390
void OPPROTO glue(op_setbe_T0_sub, SUFFIX)(void)
399 391
{
400
    int src1, src2;
392
    target_long src1, src2;
401 393
    src1 = CC_DST + CC_SRC;
402 394
    src2 = CC_SRC;
403 395

  
......
411 403

  
412 404
void OPPROTO glue(op_setl_T0_sub, SUFFIX)(void)
413 405
{
414
    int src1, src2;
406
    target_long src1, src2;
415 407
    src1 = CC_DST + CC_SRC;
416 408
    src2 = CC_SRC;
417 409

  
......
420 412

  
421 413
void OPPROTO glue(op_setle_T0_sub, SUFFIX)(void)
422 414
{
423
    int src1, src2;
415
    target_long src1, src2;
424 416
    src1 = CC_DST + CC_SRC;
425 417
    src2 = CC_SRC;
426 418

  
......
432 424
void OPPROTO glue(glue(op_shl, SUFFIX), _T0_T1)(void)
433 425
{
434 426
    int count;
435
    count = T1 & 0x1f;
427
    count = T1 & SHIFT1_MASK;
436 428
    T0 = T0 << count;
437 429
    FORCE_RET();
438 430
}
......
440 432
void OPPROTO glue(glue(op_shr, SUFFIX), _T0_T1)(void)
441 433
{
442 434
    int count;
443
    count = T1 & 0x1f;
435
    count = T1 & SHIFT1_MASK;
444 436
    T0 &= DATA_MASK;
445 437
    T0 = T0 >> count;
446 438
    FORCE_RET();
......
448 440

  
449 441
void OPPROTO glue(glue(op_sar, SUFFIX), _T0_T1)(void)
450 442
{
451
    int count, src;
452
    count = T1 & 0x1f;
443
    int count;
444
    target_long src;
445

  
446
    count = T1 & SHIFT1_MASK;
453 447
    src = (DATA_STYPE)T0;
454 448
    T0 = src >> count;
455 449
    FORCE_RET();
......
484 478
    int count;
485 479
    count = T1 & SHIFT_MASK;
486 480
    T1 = T0 >> count;
487
    T0 |= (1 << count);
481
    T0 |= (((target_long)1) << count);
488 482
}
489 483

  
490 484
void OPPROTO glue(glue(op_btr, SUFFIX), _T0_T1_cc)(void)
......
492 486
    int count;
493 487
    count = T1 & SHIFT_MASK;
494 488
    T1 = T0 >> count;
495
    T0 &= ~(1 << count);
489
    T0 &= ~(((target_long)1) << count);
496 490
}
497 491

  
498 492
void OPPROTO glue(glue(op_btc, SUFFIX), _T0_T1_cc)(void)
......
500 494
    int count;
501 495
    count = T1 & SHIFT_MASK;
502 496
    T1 = T0 >> count;
503
    T0 ^= (1 << count);
497
    T0 ^= (((target_long)1) << count);
498
}
499

  
500
void OPPROTO glue(glue(op_add_bit, SUFFIX), _A0_T1)(void)
501
{
502
    A0 += ((DATA_STYPE)T1 >> (3 + SHIFT)) << SHIFT;
504 503
}
505 504

  
506 505
void OPPROTO glue(glue(op_bsf, SUFFIX), _T0_cc)(void)
507 506
{
508
    int res, count;
507
    int count;
508
    target_long res;
509
    
509 510
    res = T0 & DATA_MASK;
510 511
    if (res != 0) {
511 512
        count = 0;
......
523 524

  
524 525
void OPPROTO glue(glue(op_bsr, SUFFIX), _T0_cc)(void)
525 526
{
526
    int res, count;
527
    int count;
528
    target_long res;
529

  
527 530
    res = T0 & DATA_MASK;
528 531
    if (res != 0) {
529 532
        count = DATA_BITS - 1;
......
555 558
    T0 = DF << SHIFT;
556 559
}
557 560

  
558
void OPPROTO glue(op_string_jz_sub, SUFFIX)(void)
559
{
560
    if ((DATA_TYPE)CC_DST == 0)
561
        JUMP_TB2(glue(op_string_jz_sub, SUFFIX), PARAM1, 3);
562
    FORCE_RET();
563
}
564

  
565
void OPPROTO glue(op_string_jnz_sub, SUFFIX)(void)
566
{
567
    if ((DATA_TYPE)CC_DST != 0)
568
        JUMP_TB2(glue(op_string_jnz_sub, SUFFIX), PARAM1, 3);
569
    FORCE_RET();
570
}
571

  
572
void OPPROTO glue(glue(op_string_jz_sub, SUFFIX), _im)(void)
573
{
574
    if ((DATA_TYPE)CC_DST == 0) {
575
        EIP = PARAM1;
576
        if (env->eflags & TF_MASK) {
577
            raise_exception(EXCP01_SSTP);
578
        }
579
        T0 = 0;
580
        EXIT_TB();
581
    }
582
    FORCE_RET();
583
}
584

  
585
void OPPROTO glue(glue(op_string_jnz_sub, SUFFIX), _im)(void)
586
{
587
    if ((DATA_TYPE)CC_DST != 0) {
588
        EIP = PARAM1;
589
        if (env->eflags & TF_MASK) {
590
            raise_exception(EXCP01_SSTP);
591
        }
592
        T0 = 0;
593
        EXIT_TB();
594
    }
595
    FORCE_RET();
596
}
597

  
598
#if DATA_BITS >= 16
599
void OPPROTO glue(op_jz_ecx, SUFFIX)(void)
600
{
601
    if ((DATA_TYPE)ECX == 0)
602
        JUMP_TB(glue(op_jz_ecx, SUFFIX), PARAM1, 1, PARAM2);
603
    FORCE_RET();
604
}
605

  
606
void OPPROTO glue(glue(op_jz_ecx, SUFFIX), _im)(void)
607
{
608
    if ((DATA_TYPE)ECX == 0) {
609
        EIP = PARAM1;
610
        if (env->eflags & TF_MASK) {
611
            raise_exception(EXCP01_SSTP);
612
        }
613
        T0 = 0;
614
        EXIT_TB();
615
    }
616
    FORCE_RET();
617
}
618
#endif
619

  
620 561
/* port I/O */
621

  
562
#if DATA_BITS <= 32
622 563
void OPPROTO glue(glue(op_out, SUFFIX), _T0_T1)(void)
623 564
{
624 565
    glue(cpu_out, SUFFIX)(env, T0, T1 & DATA_MASK);
......
648 589
{
649 590
    glue(glue(check_io, SUFFIX), _DX)();
650 591
}
592
#endif
651 593

  
652 594
#undef DATA_BITS
653 595
#undef SHIFT_MASK
596
#undef SHIFT1_MASK
654 597
#undef SIGN_MASK
655 598
#undef DATA_TYPE
656 599
#undef DATA_STYPE

Also available in: Unified diff