Revision f669df27 target-arm/translate.c

b/target-arm/translate.c
405 405
    dead_tmp(tmp);
406 406
}
407 407

  
408
/* T0 &= ~T1.  Clobbers T1.  */
409
/* FIXME: Implement bic natively.  */
410
static inline void tcg_gen_bic_i32(TCGv dest, TCGv t0, TCGv t1)
411
{
412
    TCGv tmp = new_tmp();
413
    tcg_gen_not_i32(tmp, t1);
414
    tcg_gen_and_i32(dest, t0, tmp);
415
    dead_tmp(tmp);
416
}
417

  
418 408
/* FIXME:  Implement this natively.  */
419 409
#define tcg_gen_abs_i32(t0, t1) gen_helper_abs(t0, t1)
420 410

  
421
/* FIXME:  Implement this natively.  */
422
static void tcg_gen_rori_i32(TCGv t0, TCGv t1, int i)
423
{
424
    TCGv tmp;
425

  
426
    if (i == 0)
427
        return;
428

  
429
    tmp = new_tmp();
430
    tcg_gen_shri_i32(tmp, t1, i);
431
    tcg_gen_shli_i32(t1, t1, 32 - i);
432
    tcg_gen_or_i32(t0, t1, tmp);
433
    dead_tmp(tmp);
434
}
435

  
436 411
static void shifter_out_im(TCGv var, int shift)
437 412
{
438 413
    TCGv tmp = new_tmp();
......
484 459
        if (shift != 0) {
485 460
            if (flags)
486 461
                shifter_out_im(var, shift - 1);
487
            tcg_gen_rori_i32(var, var, shift); break;
462
            tcg_gen_rotri_i32(var, var, shift); break;
488 463
        } else {
489 464
            TCGv tmp = load_cpu_field(CF);
490 465
            if (flags)
......
512 487
        case 0: gen_helper_shl(var, var, shift); break;
513 488
        case 1: gen_helper_shr(var, var, shift); break;
514 489
        case 2: gen_helper_sar(var, var, shift); break;
515
        case 3: gen_helper_ror(var, var, shift); break;
490
        case 3: tcg_gen_andi_i32(shift, shift, 0x1f);
491
                tcg_gen_rotr_i32(var, var, shift); break;
516 492
        }
517 493
    }
518 494
    dead_tmp(shift);
......
1453 1429
        case ARM_IWMMXT_wCSSF:
1454 1430
            tmp = iwmmxt_load_creg(wrd);
1455 1431
            tmp2 = load_reg(s, rd);
1456
            tcg_gen_bic_i32(tmp, tmp, tmp2);
1432
            tcg_gen_andc_i32(tmp, tmp, tmp2);
1457 1433
            dead_tmp(tmp2);
1458 1434
            iwmmxt_store_creg(wrd, tmp);
1459 1435
            break;
......
3931 3907
static void gen_neon_bsl(TCGv dest, TCGv t, TCGv f, TCGv c)
3932 3908
{
3933 3909
    tcg_gen_and_i32(t, t, c);
3934
    tcg_gen_bic_i32(f, f, c);
3910
    tcg_gen_andc_i32(f, f, c);
3935 3911
    tcg_gen_or_i32(dest, t, f);
3936 3912
}
3937 3913

  
......
4244 4220
                tcg_gen_and_i32(tmp, tmp, tmp2);
4245 4221
                break;
4246 4222
            case 1: /* BIC */
4247
                tcg_gen_bic_i32(tmp, tmp, tmp2);
4223
                tcg_gen_andc_i32(tmp, tmp, tmp2);
4248 4224
                break;
4249 4225
            case 2: /* VORR */
4250 4226
                tcg_gen_or_i32(tmp, tmp, tmp2);
4251 4227
                break;
4252 4228
            case 3: /* VORN */
4253
                tcg_gen_not_i32(tmp2, tmp2);
4254
                tcg_gen_or_i32(tmp, tmp, tmp2);
4229
                tcg_gen_orc_i32(tmp, tmp, tmp2);
4255 4230
                break;
4256 4231
            case 4: /* VEOR */
4257 4232
                tcg_gen_xor_i32(tmp, tmp, tmp2);
......
6304 6279
            }
6305 6280
            break;
6306 6281
        case 0x0e:
6307
            tcg_gen_bic_i32(tmp, tmp, tmp2);
6282
            tcg_gen_andc_i32(tmp, tmp, tmp2);
6308 6283
            if (logic_cc) {
6309 6284
                gen_logic_CC(tmp);
6310 6285
            }
......
6635 6610
                        /* ??? In many cases it's not neccessary to do a
6636 6611
                           rotate, a shift is sufficient.  */
6637 6612
                        if (shift != 0)
6638
                            tcg_gen_rori_i32(tmp, tmp, shift * 8);
6613
                            tcg_gen_rotri_i32(tmp, tmp, shift * 8);
6639 6614
                        op1 = (insn >> 20) & 7;
6640 6615
                        switch (op1) {
6641 6616
                        case 0: gen_sxtb16(tmp);  break;
......
7023 6998
        logic_cc = conds;
7024 6999
        break;
7025 7000
    case 1: /* bic */
7026
        tcg_gen_bic_i32(t0, t0, t1);
7001
        tcg_gen_andc_i32(t0, t0, t1);
7027 7002
        logic_cc = conds;
7028 7003
        break;
7029 7004
    case 2: /* orr */
......
7449 7424
            /* ??? In many cases it's not neccessary to do a
7450 7425
               rotate, a shift is sufficient.  */
7451 7426
            if (shift != 0)
7452
                tcg_gen_rori_i32(tmp, tmp, shift * 8);
7427
                tcg_gen_rotri_i32(tmp, tmp, shift * 8);
7453 7428
            op = (insn >> 20) & 7;
7454 7429
            switch (op) {
7455 7430
            case 0: gen_sxth(tmp);   break;
......
8346 8321
            break;
8347 8322
        case 0x7: /* ror */
8348 8323
            if (s->condexec_mask) {
8349
                gen_helper_ror(tmp2, tmp2, tmp);
8324
                tcg_gen_andi_i32(tmp, tmp, 0x1f);
8325
                tcg_gen_rotr_i32(tmp2, tmp2, tmp);
8350 8326
            } else {
8351 8327
                gen_helper_ror_cc(tmp2, tmp2, tmp);
8352 8328
                gen_logic_CC(tmp2);
......
8382 8358
                gen_logic_CC(tmp);
8383 8359
            break;
8384 8360
        case 0xe: /* bic */
8385
            tcg_gen_bic_i32(tmp, tmp, tmp2);
8361
            tcg_gen_andc_i32(tmp, tmp, tmp2);
8386 8362
            if (!s->condexec_mask)
8387 8363
                gen_logic_CC(tmp);
8388 8364
            break;

Also available in: Unified diff