target/arm: Convert PC-rel addressing to decodetree
Convert the ADR and ADRP instructions. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 20230512144106.3608981-5-peter.maydell@linaro.org [PMM: Rebased] Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
270076d01a
commit
45fda88ea2
@ -18,3 +18,16 @@
|
||||
#
|
||||
# This file is processed by scripts/decodetree.py
|
||||
#
|
||||
|
||||
&ri rd imm
|
||||
|
||||
|
||||
### Data Processing - Immediate
|
||||
|
||||
# PC-rel addressing
|
||||
|
||||
%imm_pcrel 5:s19 29:2
|
||||
@pcrel . .. ..... ................... rd:5 &ri imm=%imm_pcrel
|
||||
|
||||
ADR 0 .. 10000 ................... ..... @pcrel
|
||||
ADRP 1 .. 10000 ................... ..... @pcrel
|
||||
|
@ -4179,31 +4179,24 @@ static void disas_ldst(DisasContext *s, uint32_t insn)
|
||||
}
|
||||
}
|
||||
|
||||
/* PC-rel. addressing
|
||||
* 31 30 29 28 24 23 5 4 0
|
||||
* +----+-------+-----------+-------------------+------+
|
||||
* | op | immlo | 1 0 0 0 0 | immhi | Rd |
|
||||
* +----+-------+-----------+-------------------+------+
|
||||
/*
|
||||
* PC-rel. addressing
|
||||
*/
|
||||
static void disas_pc_rel_adr(DisasContext *s, uint32_t insn)
|
||||
|
||||
static bool trans_ADR(DisasContext *s, arg_ri *a)
|
||||
{
|
||||
unsigned int page, rd;
|
||||
int64_t offset;
|
||||
gen_pc_plus_diff(s, cpu_reg(s, a->rd), a->imm);
|
||||
return true;
|
||||
}
|
||||
|
||||
page = extract32(insn, 31, 1);
|
||||
/* SignExtend(immhi:immlo) -> offset */
|
||||
offset = sextract64(insn, 5, 19);
|
||||
offset = offset << 2 | extract32(insn, 29, 2);
|
||||
rd = extract32(insn, 0, 5);
|
||||
static bool trans_ADRP(DisasContext *s, arg_ri *a)
|
||||
{
|
||||
int64_t offset = (int64_t)a->imm << 12;
|
||||
|
||||
if (page) {
|
||||
/* ADRP (page based) */
|
||||
offset <<= 12;
|
||||
/* The page offset is ok for CF_PCREL. */
|
||||
offset -= s->pc_curr & 0xfff;
|
||||
}
|
||||
|
||||
gen_pc_plus_diff(s, cpu_reg(s, rd), offset);
|
||||
/* The page offset is ok for CF_PCREL. */
|
||||
offset -= s->pc_curr & 0xfff;
|
||||
gen_pc_plus_diff(s, cpu_reg(s, a->rd), offset);
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -4656,9 +4649,6 @@ static void disas_extract(DisasContext *s, uint32_t insn)
|
||||
static void disas_data_proc_imm(DisasContext *s, uint32_t insn)
|
||||
{
|
||||
switch (extract32(insn, 23, 6)) {
|
||||
case 0x20: case 0x21: /* PC-rel. addressing */
|
||||
disas_pc_rel_adr(s, insn);
|
||||
break;
|
||||
case 0x22: /* Add/subtract (immediate) */
|
||||
disas_add_sub_imm(s, insn);
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user