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