Revision c698d876

b/target-s390x/insn-data.def
126 126
    C(0xe371, LAY,     RXY_a, LD,  0, a2, 0, r1, mov2, 0)
127 127
/* LOAD ADDRESS RELATIVE LONG */
128 128
    C(0xc000, LARL,    RIL_b, Z,   0, ri2, 0, r1, mov2, 0)
129
/* LOAD BYTE */
130
    C(0xb926, LBR,     RRE,   EI,  0, r2_8s, 0, r1_32, mov2, 0)
131
    C(0xb906, LGBR,    RRE,   EI,  0, r2_8s, 0, r1, mov2, 0)
132
    C(0xe376, LB,      RXY_a, LD,  0, a2, new, r1_32, ld8s, 0)
133
    C(0xe377, LGB,     RXY_a, LD,  0, a2, r1, 0, ld8s, 0)
134
/* LOAD HALFWORD */
135
    C(0xb927, LHR,     RRE,   EI,  0, r2_16s, 0, r1_32, mov2, 0)
136
    C(0xb907, LGHR,    RRE,   EI,  0, r2_16s, 0, r1, mov2, 0)
137
    C(0x4800, LH,      RX_a,  Z,   0, a2, new, r1_32, ld16s, 0)
138
    C(0xe378, LHY,     RXY_a, LD,  0, a2, new, r1_32, ld16s, 0)
139
    C(0xe315, LGH,     RXY_a, Z,   0, a2, r1, 0, ld16s, 0)
140
/* LOAD HALFWORD IMMEDIATE */
141
    C(0xa708, LHI,     RI_a,  Z,   0, i2, 0, r1_32, mov2, 0)
142
    C(0xa709, LGHI,    RI_a,  Z,   0, i2, 0, r1, mov2, 0)
143
/* LOAD HALFWORD RELATIVE LONG */
144
    C(0xc405, LHRL,    RIL_b, GIE, 0, ri2, new, r1_32, ld16s, 0)
145
    C(0xc404, LGHRL,   RIL_b, GIE, 0, ri2, r1, 0, ld16s, 0)
129 146
/* LOAD LOGICAL */
130 147
    C(0xb916, LLGFR,   RRE,   Z,   0, r2_32u, 0, r1, mov2, 0)
131 148
    C(0xe316, LLGF,    RXY_a, Z,   0, a2, r1, 0, ld32u, 0)
132 149
/* LOAD LOGICAL RELATIVE LONG */
133 150
    C(0xc40e, LLGFRL,  RIL_b, GIE, 0, ri2, r1, 0, ld32u, 0)
151
/* LOAD LOGICAL CHARACTER */
152
    C(0xb994, LLCR,    RRE,   EI,  0, r2_8u, 0, r1_32, mov2, 0)
153
    C(0xb984, LLGCR,   RRE,   EI,  0, r2_8u, 0, r1, mov2, 0)
154
    C(0xe394, LLC,     RXY_a, EI,  0, a2, new, r1_32, ld8u, 0)
155
    C(0xe390, LLGC,    RXY_a, Z,   0, a2, r1, 0, ld8u, 0)
156
/* LOAD LOGICAL HALFWORD */
157
    C(0xb995, LLHR,    RRE,   EI,  0, r2_16u, 0, r1_32, mov2, 0)
158
    C(0xb985, LLGHR,   RRE,   EI,  0, r2_16u, 0, r1, mov2, 0)
159
    C(0xe395, LLH,     RXY_a, EI,  0, a2, new, r1_32, ld16u, 0)
160
    C(0xe391, LLGH,    RXY_a, Z,   0, a2, r1, 0, ld16u, 0)
161
/* LOAD LOGICAL HALFWORD RELATIVE LONG */
162
    C(0xc402, LLHRL,   RIL_b, GIE, 0, ri2, new, r1_32, ld16u, 0)
163
    C(0xc406, LLGHRL,  RIL_b, GIE, 0, ri2, r1, 0, ld16u, 0)
134 164

  
135 165
/* MULTIPLY */
136 166
    C(0x1c00, MR,      RR_a,  Z,   r1p1_32s, r2_32s, new, r1_D32, mul, 0)
b/target-s390x/translate.c
1391 1391
        store_reg(r1, tmp2);
1392 1392
        tcg_temp_free_i64(tmp2);
1393 1393
        break;
1394
    case 0x15: /* LGH     R1,D2(X2,B2)     [RXY] */
1395
        tmp2 = tcg_temp_new_i64();
1396
        tcg_gen_qemu_ld16s(tmp2, addr, get_mem_index(s));
1397
        store_reg(r1, tmp2);
1398
        tcg_temp_free_i64(tmp2);
1399
        break;
1400 1394
    case 0x17: /* LLGT      R1,D2(X2,B2)     [RXY] */
1401 1395
        tmp2 = tcg_temp_new_i64();
1402 1396
        tcg_gen_qemu_ld32u(tmp2, addr, get_mem_index(s));
......
1458 1452
        store_reg8(r1, tmp3);
1459 1453
        tcg_temp_free_i64(tmp3);
1460 1454
        break;
1461
    case 0x76: /* LB R1,D2(X2,B2) [RXY] */
1462
    case 0x77: /* LGB R1,D2(X2,B2) [RXY] */
1463
        tmp2 = tcg_temp_new_i64();
1464
        tcg_gen_qemu_ld8s(tmp2, addr, get_mem_index(s));
1465
        switch (op) {
1466
        case 0x76:
1467
            tcg_gen_ext8s_i64(tmp2, tmp2);
1468
            store_reg32_i64(r1, tmp2);
1469
            break;
1470
        case 0x77:
1471
            tcg_gen_ext8s_i64(tmp2, tmp2);
1472
            store_reg(r1, tmp2);
1473
            break;
1474
        default:
1475
            tcg_abort();
1476
        }
1477
        tcg_temp_free_i64(tmp2);
1478
        break;
1479
    case 0x78: /* LHY R1,D2(X2,B2) [RXY] */
1480
        tmp2 = tcg_temp_new_i64();
1481
        tcg_gen_qemu_ld16s(tmp2, addr, get_mem_index(s));
1482
        store_reg32_i64(r1, tmp2);
1483
        tcg_temp_free_i64(tmp2);
1484
        break;
1485 1455
    case 0x87: /* DLG      R1,D2(X2,B2)     [RXY] */
1486 1456
        tmp2 = tcg_temp_new_i64();
1487 1457
        tmp32_1 = tcg_const_i32(r1);
......
1517 1487
        tcg_temp_free_i64(tmp2);
1518 1488
        tcg_temp_free_i32(tmp32_1);
1519 1489
        break;
1520
    case 0x90: /* LLGC      R1,D2(X2,B2)     [RXY] */
1521
        tcg_gen_qemu_ld8u(regs[r1], addr, get_mem_index(s));
1522
        break;
1523
    case 0x91: /* LLGH      R1,D2(X2,B2)     [RXY] */
1524
        tcg_gen_qemu_ld16u(regs[r1], addr, get_mem_index(s));
1525
        break;
1526
    case 0x94: /* LLC     R1,D2(X2,B2)     [RXY] */
1527
        tmp2 = tcg_temp_new_i64();
1528
        tcg_gen_qemu_ld8u(tmp2, addr, get_mem_index(s));
1529
        store_reg32_i64(r1, tmp2);
1530
        tcg_temp_free_i64(tmp2);
1531
        break;
1532
    case 0x95: /* LLH     R1,D2(X2,B2)     [RXY] */
1533
        tmp2 = tcg_temp_new_i64();
1534
        tcg_gen_qemu_ld16u(tmp2, addr, get_mem_index(s));
1535
        store_reg32_i64(r1, tmp2);
1536
        tcg_temp_free_i64(tmp2);
1537
        break;
1538 1490
    case 0x97: /* DL     R1,D2(X2,B2)     [RXY] */
1539 1491
        /* reg(r1) = reg(r1, r1+1) % ld32(addr) */
1540 1492
        /* reg(r1+1) = reg(r1, r1+1) / ld32(addr) */
......
2194 2146
        s->is_jmp = DISAS_TB_JUMP;
2195 2147
        tcg_temp_free_i64(tmp);
2196 2148
        break;
2197
    case 0x8: /* lhi r1, i2 */
2198
        tmp32_1 = tcg_const_i32(i2);
2199
        store_reg32(r1, tmp32_1);
2200
        tcg_temp_free_i32(tmp32_1);
2201
        break;
2202
    case 0x9: /* lghi r1, i2 */
2203
        tmp = tcg_const_i64(i2);
2204
        store_reg(r1, tmp);
2205
        tcg_temp_free_i64(tmp);
2206
        break;
2207 2149
    default:
2208 2150
        LOG_DISAS("illegal a7 operation 0x%x\n", op);
2209 2151
        gen_illegal_opcode(s);
......
2911 2853
        }
2912 2854
        tcg_temp_free_i64(tmp);
2913 2855
        break;
2914
    case 0x6: /* LGBR R1,R2 [RRE] */
2915
        tmp2 = load_reg(r2);
2916
        tcg_gen_ext8s_i64(tmp2, tmp2);
2917
        store_reg(r1, tmp2);
2918
        tcg_temp_free_i64(tmp2);
2919
        break;
2920 2856
    case 0xd: /* DSGR      R1,R2     [RRE] */
2921 2857
    case 0x1d: /* DSGFR      R1,R2     [RRE] */
2922 2858
        tmp = load_reg(r1 + 1);
......
2955 2891
        store_reg32(r1, tmp32_1);
2956 2892
        tcg_temp_free_i32(tmp32_1);
2957 2893
        break;
2958
    case 0x26: /* LBR R1,R2 [RRE] */
2959
        tmp32_1 = load_reg32(r2);
2960
        tcg_gen_ext8s_i32(tmp32_1, tmp32_1);
2961
        store_reg32(r1, tmp32_1);
2962
        tcg_temp_free_i32(tmp32_1);
2963
        break;
2964
    case 0x27: /* LHR R1,R2 [RRE] */
2965
        tmp32_1 = load_reg32(r2);
2966
        tcg_gen_ext16s_i32(tmp32_1, tmp32_1);
2967
        store_reg32(r1, tmp32_1);
2968
        tcg_temp_free_i32(tmp32_1);
2969
        break;
2970 2894
    case 0x83: /* FLOGR R1,R2 [RRE] */
2971 2895
        tmp = load_reg(r2);
2972 2896
        tmp32_1 = tcg_const_i32(r1);
......
2975 2899
        tcg_temp_free_i64(tmp);
2976 2900
        tcg_temp_free_i32(tmp32_1);
2977 2901
        break;
2978
    case 0x84: /* LLGCR R1,R2 [RRE] */
2979
        tmp = load_reg(r2);
2980
        tcg_gen_andi_i64(tmp, tmp, 0xff);
2981
        store_reg(r1, tmp);
2982
        tcg_temp_free_i64(tmp);
2983
        break;
2984
    case 0x85: /* LLGHR R1,R2 [RRE] */
2985
        tmp = load_reg(r2);
2986
        tcg_gen_andi_i64(tmp, tmp, 0xffff);
2987
        store_reg(r1, tmp);
2988
        tcg_temp_free_i64(tmp);
2989
        break;
2990 2902
    case 0x87: /* DLGR      R1,R2     [RRE] */
2991 2903
        tmp32_1 = tcg_const_i32(r1);
2992 2904
        tmp = load_reg(r2);
......
3021 2933
        tcg_temp_free_i64(tmp2);
3022 2934
        tcg_temp_free_i32(tmp32_1);
3023 2935
        break;
3024
    case 0x94: /* LLCR R1,R2 [RRE] */
3025
        tmp32_1 = load_reg32(r2);
3026
        tcg_gen_andi_i32(tmp32_1, tmp32_1, 0xff);
3027
        store_reg32(r1, tmp32_1);
3028
        tcg_temp_free_i32(tmp32_1);
3029
        break;
3030
    case 0x95: /* LLHR R1,R2 [RRE] */
3031
        tmp32_1 = load_reg32(r2);
3032
        tcg_gen_andi_i32(tmp32_1, tmp32_1, 0xffff);
3033
        store_reg32(r1, tmp32_1);
3034
        tcg_temp_free_i32(tmp32_1);
3035
        break;
3036 2936
    case 0x97: /* DLR     R1,R2     [RRE] */
3037 2937
        /* reg(r1) = reg(r1, r1+1) % reg(r2) */
3038 2938
        /* reg(r1+1) = reg(r1, r1+1) / reg(r2) */
......
3429 3329
        tcg_temp_free_i64(tmp);
3430 3330
        s->is_jmp = DISAS_TB_JUMP;
3431 3331
        break;
3432
    case 0x48: /* LH     R1,D2(X2,B2)     [RX] */
3433
        insn = ld_code4(env, s->pc);
3434
        tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
3435
        tmp2 = tcg_temp_new_i64();
3436
        tcg_gen_qemu_ld16s(tmp2, tmp, get_mem_index(s));
3437
        store_reg32_i64(r1, tmp2);
3438
        tcg_temp_free_i64(tmp);
3439
        tcg_temp_free_i64(tmp2);
3440
        break;
3441 3332
    case 0x4d: /* BAS    R1,D2(X2,B2)     [RX] */
3442 3333
        insn = ld_code4(env, s->pc);
3443 3334
        tmp = decode_rx(s, insn, &r1, &x2, &b2, &d2);
......
4366 4257
    return NO_EXIT;
4367 4258
}
4368 4259

  
4260
static ExitStatus op_ld8s(DisasContext *s, DisasOps *o)
4261
{
4262
    tcg_gen_qemu_ld8s(o->out, o->in2, get_mem_index(s));
4263
    return NO_EXIT;
4264
}
4265

  
4266
static ExitStatus op_ld8u(DisasContext *s, DisasOps *o)
4267
{
4268
    tcg_gen_qemu_ld8u(o->out, o->in2, get_mem_index(s));
4269
    return NO_EXIT;
4270
}
4271

  
4272
static ExitStatus op_ld16s(DisasContext *s, DisasOps *o)
4273
{
4274
    tcg_gen_qemu_ld16s(o->out, o->in2, get_mem_index(s));
4275
    return NO_EXIT;
4276
}
4277

  
4278
static ExitStatus op_ld16u(DisasContext *s, DisasOps *o)
4279
{
4280
    tcg_gen_qemu_ld16u(o->out, o->in2, get_mem_index(s));
4281
    return NO_EXIT;
4282
}
4283

  
4369 4284
static ExitStatus op_ld32s(DisasContext *s, DisasOps *o)
4370 4285
{
4371 4286
    tcg_gen_qemu_ld32s(o->out, o->in2, get_mem_index(s));
......
4676 4591
    o->g_in2 = true;
4677 4592
}
4678 4593

  
4594
static void in2_r2_8s(DisasContext *s, DisasFields *f, DisasOps *o)
4595
{
4596
    o->in2 = tcg_temp_new_i64();
4597
    tcg_gen_ext8s_i64(o->in2, regs[get_field(f, r2)]);
4598
}
4599

  
4600
static void in2_r2_8u(DisasContext *s, DisasFields *f, DisasOps *o)
4601
{
4602
    o->in2 = tcg_temp_new_i64();
4603
    tcg_gen_ext8u_i64(o->in2, regs[get_field(f, r2)]);
4604
}
4605

  
4606
static void in2_r2_16s(DisasContext *s, DisasFields *f, DisasOps *o)
4607
{
4608
    o->in2 = tcg_temp_new_i64();
4609
    tcg_gen_ext16s_i64(o->in2, regs[get_field(f, r2)]);
4610
}
4611

  
4612
static void in2_r2_16u(DisasContext *s, DisasFields *f, DisasOps *o)
4613
{
4614
    o->in2 = tcg_temp_new_i64();
4615
    tcg_gen_ext16u_i64(o->in2, regs[get_field(f, r2)]);
4616
}
4617

  
4679 4618
static void in2_r3(DisasContext *s, DisasFields *f, DisasOps *o)
4680 4619
{
4681 4620
    o->in2 = load_reg(get_field(f, r3));

Also available in: Unified diff