Revision 4f7403d5 target-s390x/translate.c

b/target-s390x/translate.c
1012 1012
    }
1013 1013
}
1014 1014

  
1015
static void gen_op_clc(DisasContext *s, int l, TCGv_i64 s1, TCGv_i64 s2)
1016
{
1017
    TCGv_i64 tmp;
1018
    TCGv_i64 tmp2;
1019
    TCGv_i32 vl;
1020

  
1021
    /* check for simple 32bit or 64bit match */
1022
    switch (l) {
1023
    case 0:
1024
        tmp = tcg_temp_new_i64();
1025
        tmp2 = tcg_temp_new_i64();
1026

  
1027
        tcg_gen_qemu_ld8u(tmp, s1, get_mem_index(s));
1028
        tcg_gen_qemu_ld8u(tmp2, s2, get_mem_index(s));
1029
        cmp_u64(s, tmp, tmp2);
1030

  
1031
        tcg_temp_free_i64(tmp);
1032
        tcg_temp_free_i64(tmp2);
1033
        return;
1034
    case 1:
1035
        tmp = tcg_temp_new_i64();
1036
        tmp2 = tcg_temp_new_i64();
1037

  
1038
        tcg_gen_qemu_ld16u(tmp, s1, get_mem_index(s));
1039
        tcg_gen_qemu_ld16u(tmp2, s2, get_mem_index(s));
1040
        cmp_u64(s, tmp, tmp2);
1041

  
1042
        tcg_temp_free_i64(tmp);
1043
        tcg_temp_free_i64(tmp2);
1044
        return;
1045
    case 3:
1046
        tmp = tcg_temp_new_i64();
1047
        tmp2 = tcg_temp_new_i64();
1048

  
1049
        tcg_gen_qemu_ld32u(tmp, s1, get_mem_index(s));
1050
        tcg_gen_qemu_ld32u(tmp2, s2, get_mem_index(s));
1051
        cmp_u64(s, tmp, tmp2);
1052

  
1053
        tcg_temp_free_i64(tmp);
1054
        tcg_temp_free_i64(tmp2);
1055
        return;
1056
    case 7:
1057
        tmp = tcg_temp_new_i64();
1058
        tmp2 = tcg_temp_new_i64();
1059

  
1060
        tcg_gen_qemu_ld64(tmp, s1, get_mem_index(s));
1061
        tcg_gen_qemu_ld64(tmp2, s2, get_mem_index(s));
1062
        cmp_u64(s, tmp, tmp2);
1063

  
1064
        tcg_temp_free_i64(tmp);
1065
        tcg_temp_free_i64(tmp2);
1066
        return;
1067
    }
1068

  
1069
    potential_page_fault(s);
1070
    vl = tcg_const_i32(l);
1071
    gen_helper_clc(cc_op, cpu_env, vl, s1, s2);
1072
    tcg_temp_free_i32(vl);
1073
    set_cc_static(s);
1074
}
1075

  
1076 1015
static void disas_e3(CPUS390XState *env, DisasContext* s, int op, int r1,
1077 1016
                     int x2, int b2, int d2)
1078 1017
{
......
2200 2139
        tcg_temp_free_i32(tmp32_1);
2201 2140
        tcg_temp_free_i32(tmp32_2);
2202 2141
        break;
2203
    case 0xd5: /* CLC    D1(L,B1),D2(B2)         [SS] */
2204
        insn = ld_code6(env, s->pc);
2205
        b1 = (insn >> 28) & 0xf;
2206
        b2 = (insn >> 12) & 0xf;
2207
        d1 = (insn >> 16) & 0xfff;
2208
        d2 = insn & 0xfff;
2209
        tmp = get_address(s, 0, b1, d1);
2210
        tmp2 = get_address(s, 0, b2, d2);
2211
        gen_op_clc(s, (insn >> 32) & 0xff, tmp, tmp2);
2212
        tcg_temp_free_i64(tmp);
2213
        tcg_temp_free_i64(tmp2);
2214
        break;
2215 2142
#ifndef CONFIG_USER_ONLY
2216 2143
    case 0xda: /* MVCP     D1(R1,B1),D2(B2),R3   [SS] */
2217 2144
    case 0xdb: /* MVCS     D1(R1,B1),D2(B2),R3   [SS] */
......
2797 2724
    return help_branch(s, &c, is_imm, imm, o->in2);
2798 2725
}
2799 2726

  
2727
static ExitStatus op_clc(DisasContext *s, DisasOps *o)
2728
{
2729
    int l = get_field(s->fields, l1);
2730
    TCGv_i32 vl;
2731

  
2732
    switch (l + 1) {
2733
    case 1:
2734
        tcg_gen_qemu_ld8u(cc_src, o->addr1, get_mem_index(s));
2735
        tcg_gen_qemu_ld8u(cc_dst, o->in2, get_mem_index(s));
2736
        break;
2737
    case 2:
2738
        tcg_gen_qemu_ld16u(cc_src, o->addr1, get_mem_index(s));
2739
        tcg_gen_qemu_ld16u(cc_dst, o->in2, get_mem_index(s));
2740
        break;
2741
    case 4:
2742
        tcg_gen_qemu_ld32u(cc_src, o->addr1, get_mem_index(s));
2743
        tcg_gen_qemu_ld32u(cc_dst, o->in2, get_mem_index(s));
2744
        break;
2745
    case 8:
2746
        tcg_gen_qemu_ld64(cc_src, o->addr1, get_mem_index(s));
2747
        tcg_gen_qemu_ld64(cc_dst, o->in2, get_mem_index(s));
2748
        break;
2749
    default:
2750
        potential_page_fault(s);
2751
        vl = tcg_const_i32(l);
2752
        gen_helper_clc(cc_op, cpu_env, vl, o->addr1, o->in2);
2753
        tcg_temp_free_i32(vl);
2754
        set_cc_static(s);
2755
        return NO_EXIT;
2756
    }
2757
    gen_op_update2_cc_i64(s, CC_OP_LTUGTU_64, cc_src, cc_dst);
2758
    return NO_EXIT;
2759
}
2760

  
2800 2761
static ExitStatus op_clcle(DisasContext *s, DisasOps *o)
2801 2762
{
2802 2763
    TCGv_i32 r1 = tcg_const_i32(get_field(s->fields, r1));

Also available in: Unified diff