mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-26 11:32:23 -06:00
target/arm: Avoid tcg_const_ptr in handle_rev
Here it is not trivial to notice first initialization, so explicitly zero the temps. Use an array for the output, rather than separate tcg_rd/tcg_rd_hi variables. Fixes a bug by adding a missing clear_vec_high. Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
1b7bc9b5c8
commit
56649fd949
1 changed files with 15 additions and 11 deletions
|
@ -12003,22 +12003,26 @@ static void handle_rev(DisasContext *s, int opcode, bool u,
|
||||||
int esize = 8 << size;
|
int esize = 8 << size;
|
||||||
int elements = dsize / esize;
|
int elements = dsize / esize;
|
||||||
TCGv_i64 tcg_rn = tcg_temp_new_i64();
|
TCGv_i64 tcg_rn = tcg_temp_new_i64();
|
||||||
TCGv_i64 tcg_rd = tcg_const_i64(0);
|
TCGv_i64 tcg_rd[2];
|
||||||
TCGv_i64 tcg_rd_hi = tcg_const_i64(0);
|
|
||||||
|
for (i = 0; i < 2; i++) {
|
||||||
|
tcg_rd[i] = tcg_temp_new_i64();
|
||||||
|
tcg_gen_movi_i64(tcg_rd[i], 0);
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < elements; i++) {
|
for (i = 0; i < elements; i++) {
|
||||||
int e_rev = (i & 0xf) ^ revmask;
|
int e_rev = (i & 0xf) ^ revmask;
|
||||||
int off = e_rev * esize;
|
int w = (e_rev * esize) / 64;
|
||||||
|
int o = (e_rev * esize) % 64;
|
||||||
|
|
||||||
read_vec_element(s, tcg_rn, rn, i, size);
|
read_vec_element(s, tcg_rn, rn, i, size);
|
||||||
if (off >= 64) {
|
tcg_gen_deposit_i64(tcg_rd[w], tcg_rd[w], tcg_rn, o, esize);
|
||||||
tcg_gen_deposit_i64(tcg_rd_hi, tcg_rd_hi,
|
|
||||||
tcg_rn, off - 64, esize);
|
|
||||||
} else {
|
|
||||||
tcg_gen_deposit_i64(tcg_rd, tcg_rd, tcg_rn, off, esize);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
write_vec_element(s, tcg_rd, rd, 0, MO_64);
|
|
||||||
write_vec_element(s, tcg_rd_hi, rd, 1, MO_64);
|
for (i = 0; i < 2; i++) {
|
||||||
|
write_vec_element(s, tcg_rd[i], rd, i, MO_64);
|
||||||
|
}
|
||||||
|
clear_vec_high(s, true, rd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue