Revision bf76bafa target-cris/translate_v10.c

b/target-cris/translate_v10.c
23 23

  
24 24
static const char *regnames_v10[] =
25 25
{
26
	"$r0", "$r1", "$r2", "$r3",
27
	"$r4", "$r5", "$r6", "$r7",
28
	"$r8", "$r9", "$r10", "$r11",
29
	"$r12", "$r13", "$sp", "$pc",
26
    "$r0", "$r1", "$r2", "$r3",
27
    "$r4", "$r5", "$r6", "$r7",
28
    "$r8", "$r9", "$r10", "$r11",
29
    "$r12", "$r13", "$sp", "$pc",
30 30
};
31 31

  
32 32
static const char *pregnames_v10[] =
33 33
{
34
	"$bz", "$vr", "$p2", "$p3",
35
	"$wz", "$ccr", "$p6-prefix", "$mof",
36
	"$dz", "$ibr", "$irp", "$srp",
37
	"$bar", "$dccr", "$brp", "$usp",
34
    "$bz", "$vr", "$p2", "$p3",
35
    "$wz", "$ccr", "$p6-prefix", "$mof",
36
    "$dz", "$ibr", "$irp", "$srp",
37
    "$bar", "$dccr", "$brp", "$usp",
38 38
};
39 39

  
40 40
/* We need this table to handle preg-moves with implicit width.  */
41 41
static int preg_sizes_v10[] = {
42
	1, /* bz.  */
43
	1, /* vr.  */
44
	1, /* pid. */
45
	1, /* srs. */
46
	2, /* wz.  */
47
	2, 2, 4,
48
	4, 4, 4, 4,
49
	4, 4, 4, 4,
42
    1, /* bz.  */
43
    1, /* vr.  */
44
    1, /* pid. */
45
    1, /* srs. */
46
    2, /* wz.  */
47
    2, 2, 4,
48
    4, 4, 4, 4,
49
    4, 4, 4, 4,
50 50
};
51 51

  
52 52
static inline int dec10_size(unsigned int size)
......
109 109
static int dec10_prep_move_m(DisasContext *dc, int s_ext, int memsize,
110 110
                           TCGv dst)
111 111
{
112
        unsigned int rs, rd;
113
        uint32_t imm;
114
        int is_imm;
115
        int insn_len = 0;
116

  
117
        rs = dc->src;
118
        rd = dc->dst;
119
        is_imm = rs == 15 && !(dc->tb_flags & PFIX_FLAG);
120
        LOG_DIS("rs=%d rd=%d is_imm=%d mode=%d pfix=%d\n",
121
                  rs, rd, is_imm, dc->mode, dc->tb_flags & PFIX_FLAG);
122

  
123
        /* Load [$rs] onto T1.  */
124
        if (is_imm) {
125
                if (memsize != 4) {
126
                        if (s_ext) {
127
                                if (memsize == 1)
128
                                        imm = ldsb_code(dc->pc + 2);
129
                                else
130
                                        imm = ldsw_code(dc->pc + 2);
131
                        } else {
132
                                if (memsize == 1)
133
                                        imm = ldub_code(dc->pc + 2);
134
                                else
135
                                        imm = lduw_code(dc->pc + 2);
136
                        }
137
                } else
138
                        imm = ldl_code(dc->pc + 2);
139

  
140
                tcg_gen_movi_tl(dst, imm);
141

  
142
                if (dc->mode == CRISV10_MODE_AUTOINC) {
143
                    insn_len += memsize;
144
                    if (memsize == 1)
145
                            insn_len++;
146
                    tcg_gen_addi_tl(cpu_R[15], cpu_R[15], insn_len);
147
                }
148
        } else {
149
                TCGv addr;
150

  
151
                addr = tcg_temp_new();
152
                cris_flush_cc_state(dc);
153
                crisv10_prepare_memaddr(dc, addr, memsize);
154
                gen_load(dc, dst, addr, memsize, 0);
155
                if (s_ext)
156
                        t_gen_sext(dst, dst, memsize);
112
    unsigned int rs, rd;
113
    uint32_t imm;
114
    int is_imm;
115
    int insn_len = 0;
116

  
117
    rs = dc->src;
118
    rd = dc->dst;
119
    is_imm = rs == 15 && !(dc->tb_flags & PFIX_FLAG);
120
    LOG_DIS("rs=%d rd=%d is_imm=%d mode=%d pfix=%d\n",
121
             rs, rd, is_imm, dc->mode, dc->tb_flags & PFIX_FLAG);
122

  
123
    /* Load [$rs] onto T1.  */
124
    if (is_imm) {
125
        if (memsize != 4) {
126
            if (s_ext) {
127
                if (memsize == 1)
128
                    imm = ldsb_code(dc->pc + 2);
157 129
                else
158
                        t_gen_zext(dst, dst, memsize);
159
                insn_len += crisv10_post_memaddr(dc, memsize);
160
                tcg_temp_free(addr);
161
        }
130
                    imm = ldsw_code(dc->pc + 2);
131
            } else {
132
                if (memsize == 1)
133
                    imm = ldub_code(dc->pc + 2);
134
                else
135
                    imm = lduw_code(dc->pc + 2);
136
            }
137
        } else
138
            imm = ldl_code(dc->pc + 2);
162 139

  
163
        if (dc->mode == CRISV10_MODE_INDIRECT && (dc->tb_flags & PFIX_FLAG)) {
164
            dc->dst = dc->src;
140
        tcg_gen_movi_tl(dst, imm);
141

  
142
        if (dc->mode == CRISV10_MODE_AUTOINC) {
143
            insn_len += memsize;
144
            if (memsize == 1)
145
                insn_len++;
146
            tcg_gen_addi_tl(cpu_R[15], cpu_R[15], insn_len);
165 147
        }
166
        return insn_len;
148
    } else {
149
        TCGv addr;
150

  
151
        addr = tcg_temp_new();
152
        cris_flush_cc_state(dc);
153
        crisv10_prepare_memaddr(dc, addr, memsize);
154
        gen_load(dc, dst, addr, memsize, 0);
155
        if (s_ext)
156
            t_gen_sext(dst, dst, memsize);
157
        else
158
            t_gen_zext(dst, dst, memsize);
159
        insn_len += crisv10_post_memaddr(dc, memsize);
160
        tcg_temp_free(addr);
161
    }
162

  
163
    if (dc->mode == CRISV10_MODE_INDIRECT && (dc->tb_flags & PFIX_FLAG)) {
164
        dc->dst = dc->src;
165
    }
166
    return insn_len;
167 167
}
168 168

  
169 169
static unsigned int dec10_quick_imm(DisasContext *dc)
......
439 439

  
440 440
static void dec10_reg_abs(DisasContext *dc)
441 441
{
442
	TCGv t0;
442
    TCGv t0;
443 443

  
444
	LOG_DIS("abs $r%u, $r%u\n",
445
		    dc->src, dc->dst);
444
    LOG_DIS("abs $r%u, $r%u\n", dc->src, dc->dst);
446 445

  
447
	assert(dc->dst != 15);
448
	t0 = tcg_temp_new();
449
	tcg_gen_sari_tl(t0, cpu_R[dc->src], 31);
450
	tcg_gen_xor_tl(cpu_R[dc->dst], cpu_R[dc->src], t0);
451
	tcg_gen_sub_tl(t0, cpu_R[dc->dst], t0);
446
    assert(dc->dst != 15);
447
    t0 = tcg_temp_new();
448
    tcg_gen_sari_tl(t0, cpu_R[dc->src], 31);
449
    tcg_gen_xor_tl(cpu_R[dc->dst], cpu_R[dc->src], t0);
450
    tcg_gen_sub_tl(t0, cpu_R[dc->dst], t0);
452 451

  
453
	cris_alu(dc, CC_OP_MOVE,
454
		    cpu_R[dc->dst], cpu_R[dc->dst], t0, 4);
455
	tcg_temp_free(t0);
452
    cris_alu(dc, CC_OP_MOVE, cpu_R[dc->dst], cpu_R[dc->dst], t0, 4);
453
    tcg_temp_free(t0);
456 454
}
457 455

  
458 456
static void dec10_reg_swap(DisasContext *dc)
......
478 476

  
479 477
static void dec10_reg_scc(DisasContext *dc)
480 478
{
481
        int cond = dc->dst;
479
    int cond = dc->dst;
482 480

  
483
        LOG_DIS("s%s $r%u\n",
484
                    cc_name(cond), dc->src);
481
    LOG_DIS("s%s $r%u\n", cc_name(cond), dc->src);
485 482

  
486
        if (cond != CC_A)
487
        {
488
                int l1;
483
    if (cond != CC_A)
484
    {
485
        int l1;
489 486

  
490
                gen_tst_cc (dc, cpu_R[dc->src], cond);
491
                l1 = gen_new_label();
492
                tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_R[dc->src], 0, l1);
493
                tcg_gen_movi_tl(cpu_R[dc->src], 1);
494
                gen_set_label(l1);
495
        }
496
        else
497
                tcg_gen_movi_tl(cpu_R[dc->src], 1);
487
        gen_tst_cc (dc, cpu_R[dc->src], cond);
488
        l1 = gen_new_label();
489
        tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_R[dc->src], 0, l1);
490
        tcg_gen_movi_tl(cpu_R[dc->src], 1);
491
        gen_set_label(l1);
492
    } else {
493
        tcg_gen_movi_tl(cpu_R[dc->src], 1);
494
    }
498 495

  
499
        cris_cc_mask(dc, 0);
496
    cris_cc_mask(dc, 0);
500 497
}
501 498

  
502 499
static unsigned int dec10_reg(DisasContext *dc)
......
838 835
        tcg_gen_mov_tl(cpu_R[dc->src], t0);
839 836
    }
840 837

  
841

  
842 838
    if (!pfix && dc->mode == CRISV10_MODE_AUTOINC) {
843 839
        tcg_gen_mov_tl(cpu_R[dc->src], addr);
844 840
    }

Also available in: Unified diff