Revision d57c4e01 ops_template.h

b/ops_template.h
175 175
static int glue(compute_all_shl, SUFFIX)(void)
176 176
{
177 177
    int cf, pf, af, zf, sf, of;
178
    cf = CC_SRC & 1;
178
    cf = (CC_SRC >> (DATA_BITS - 1)) & CC_C;
179 179
    pf = parity_table[(uint8_t)CC_DST];
180 180
    af = 0; /* undefined */
181 181
    zf = ((DATA_TYPE)CC_DST == 0) << 6;
182 182
    sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80;
183
    of = lshift(CC_SRC, 12 - DATA_BITS) & CC_O; /* only meaniful for shr with count == 1 */
183
    /* of is defined if shift count == 1 */
184
    of = lshift(CC_SRC ^ CC_DST, 12 - DATA_BITS) & CC_O;
184 185
    return cf | pf | af | zf | sf | of;
185 186
}
186 187

  
......
199 200
    af = 0; /* undefined */
200 201
    zf = ((DATA_TYPE)CC_DST == 0) << 6;
201 202
    sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80;
202
    of = 0; /* only meaniful for shr with count == 1 */
203
    /* of is defined if shift count == 1 */
204
    of = lshift(CC_SRC ^ CC_DST, 12 - DATA_BITS) & CC_O; 
203 205
    return cf | pf | af | zf | sf | of;
204 206
}
205 207

  
......
415 417
{
416 418
    int count;
417 419
    count = T1 & 0x1f;
418
    if (count == 1) {
419
        CC_SRC = T0;
420
        T0 = T0 << 1;
421
        CC_DST = T0;
422
        CC_OP = CC_OP_ADDB + SHIFT;
423
    } else if (count) {
424
        CC_SRC = (DATA_TYPE)T0 >> (DATA_BITS - count);
420
    if (count) {
421
        CC_SRC = (DATA_TYPE)T0 << (count - 1);
425 422
        T0 = T0 << count;
426 423
        CC_DST = T0;
427 424
        CC_OP = CC_OP_SHLB + SHIFT;
......
438 435
        CC_SRC = T0 >> (count - 1);
439 436
        T0 = T0 >> count;
440 437
        CC_DST = T0;
441
        CC_OP = CC_OP_SHLB + SHIFT;
438
        CC_OP = CC_OP_SARB + SHIFT;
442 439
    }
443 440
    FORCE_RET();
444 441
}
......
449 446
    count = T1 & 0x1f;
450 447
    if (count) {
451 448
        src = (DATA_STYPE)T0;
452
        CC_SRC =  src >> (count - 1);
449
        CC_SRC = src >> (count - 1);
453 450
        T0 = src >> count;
454 451
        CC_DST = T0;
455 452
        CC_OP = CC_OP_SARB + SHIFT;
......
457 454
    FORCE_RET();
458 455
}
459 456

  
457
#if DATA_BITS == 16
458
/* XXX: overflow flag might be incorrect in some cases in shldw */
459
void OPPROTO glue(glue(op_shld, SUFFIX), _T0_T1_im_cc)(void)
460
{
461
    int count;
462
    unsigned int res;
463
    count = PARAM1;
464
    T1 &= 0xffff;
465
    res = T1 | (T0 << 16);
466
    CC_SRC = res >> (32 - count);
467
    res <<= count;
468
    if (count > 16)
469
        res |= T1 << (count - 16);
470
    T0 = res >> 16;
471
    CC_DST = T0;
472
}
473

  
474
void OPPROTO glue(glue(op_shld, SUFFIX), _T0_T1_ECX_cc)(void)
475
{
476
    int count;
477
    unsigned int res;
478
    count = ECX & 0x1f;
479
    if (count) {
480
        T1 &= 0xffff;
481
        res = T1 | (T0 << 16);
482
        CC_SRC = res >> (32 - count);
483
        res <<= count;
484
        if (count > 16)
485
          res |= T1 << (count - 16);
486
        T0 = res >> 16;
487
        CC_DST = T0;
488
        CC_OP = CC_OP_SARB + SHIFT;
489
    }
490
}
491

  
492
void OPPROTO glue(glue(op_shrd, SUFFIX), _T0_T1_im_cc)(void)
493
{
494
    int count;
495
    unsigned int res;
496

  
497
    count = PARAM1;
498
    res = (T0 & 0xffff) | (T1 << 16);
499
    CC_SRC = res >> (count - 1);
500
    res >>= count;
501
    if (count > 16)
502
        res |= T1 << (32 - count);
503
    T0 = res;
504
    CC_DST = T0;
505
}
506

  
507

  
508
void OPPROTO glue(glue(op_shrd, SUFFIX), _T0_T1_ECX_cc)(void)
509
{
510
    int count;
511
    unsigned int res;
512

  
513
    count = ECX & 0x1f;
514
    if (count) {
515
        res = (T0 & 0xffff) | (T1 << 16);
516
        CC_SRC = res >> (count - 1);
517
        res >>= count;
518
        if (count > 16)
519
            res |= T1 << (32 - count);
520
        T0 = res;
521
        CC_DST = T0;
522
        CC_OP = CC_OP_SARB + SHIFT;
523
    }
524
}
525
#endif
526

  
527
#if DATA_BITS == 32
528
void OPPROTO glue(glue(op_shld, SUFFIX), _T0_T1_im_cc)(void)
529
{
530
    int count;
531
    count = PARAM1;
532
    T0 &= DATA_MASK;
533
    T1 &= DATA_MASK;
534
    CC_SRC = T0 << (count - 1);
535
    T0 = (T0 << count) | (T1 >> (DATA_BITS - count));
536
    CC_DST = T0;
537
}
538

  
539
void OPPROTO glue(glue(op_shld, SUFFIX), _T0_T1_ECX_cc)(void)
540
{
541
    int count;
542
    count = ECX & 0x1f;
543
    if (count) {
544
        T0 &= DATA_MASK;
545
        T1 &= DATA_MASK;
546
        CC_SRC = T0 << (count - 1);
547
        T0 = (T0 << count) | (T1 >> (DATA_BITS - count));
548
        CC_DST = T0;
549
        CC_OP = CC_OP_SHLB + SHIFT;
550
    }
551
}
552

  
553
void OPPROTO glue(glue(op_shrd, SUFFIX), _T0_T1_im_cc)(void)
554
{
555
    int count;
556
    count = PARAM1;
557
    T0 &= DATA_MASK;
558
    T1 &= DATA_MASK;
559
    CC_SRC = T0 >> (count - 1);
560
    T0 = (T0 >> count) | (T1 << (DATA_BITS - count));
561
    CC_DST = T0;
562
}
563

  
564

  
565
void OPPROTO glue(glue(op_shrd, SUFFIX), _T0_T1_ECX_cc)(void)
566
{
567
    int count;
568
    count = ECX & 0x1f;
569
    if (count) {
570
        T0 &= DATA_MASK;
571
        T1 &= DATA_MASK;
572
        CC_SRC = T0 >> (count - 1);
573
        T0 = (T0 >> count) | (T1 << (DATA_BITS - count));
574
        CC_DST = T0;
575
        CC_OP = CC_OP_SARB + SHIFT;
576
    }
577
}
578
#endif
579

  
460 580
/* carry add/sub (we only need to set CC_OP differently) */
461 581

  
462 582
void OPPROTO glue(glue(op_adc, SUFFIX), _T0_T1_cc)(void)

Also available in: Unified diff