mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2024-12-23 10:35:27 +00:00
target/arm: Add stubs for AArch32 VFP decodetree
Add the infrastructure for building and invoking a decodetree decoder for the AArch32 VFP encodings. At the moment the new decoder covers nothing, so we always fall back to the existing hand-written decode. We need to have one decoder for the unconditional insns and one for the conditional insns, as otherwise the patterns for conditional insns would incorrectly match against the unconditional ones too. Since translate.c is over 14,000 lines long and we're going to be touching pretty much every line of the VFP code as part of the decodetree conversion, we create a new translate-vfp.inc.c to hold the code which deals with VFP in the new scheme. It should be possible to convert this into a standalone translation unit eventually, but the conversion process will be much simpler if we simply #include it midway through translate.c to start with. Backports commit 78e138bc1f672c145ef6ace74617db00eebaa2ba from qemu
This commit is contained in:
parent
7c03c8eb04
commit
9732ebba5c
|
@ -14,5 +14,18 @@ target/arm/decode-sve.inc.c: $(SRC_PATH)/target/arm/sve.decode $(DECODETREE)
|
|||
$(PYTHON) $(DECODETREE) --decode disas_sve -o $@ $<,\
|
||||
"GEN", $(TARGET_DIR)$@)
|
||||
|
||||
target/arm/decode-vfp.inc.c: $(SRC_PATH)/target/arm/vfp.decode $(DECODETREE)
|
||||
$(call quiet-command,\
|
||||
$(PYTHON) $(DECODETREE) --static-decode disas_vfp -o $@ $<,\
|
||||
"GEN", $(TARGET_DIR)$@)
|
||||
|
||||
target/arm/decode-vfp-uncond.inc.c: $(SRC_PATH)/target/arm/vfp-uncond.decode $(DECODETREE)
|
||||
$(call quiet-command,\
|
||||
$(PYTHON) $(DECODETREE) --static-decode disas_vfp_uncond -o $@ $<,\
|
||||
"GEN", $(TARGET_DIR)$@)
|
||||
|
||||
target/arm/translate-sve.o: target/arm/decode-sve.inc.c
|
||||
target/arm/translate.o: target/arm/decode-vfp.inc.c
|
||||
target/arm/translate.o: target/arm/decode-vfp-uncond.inc.c
|
||||
|
||||
obj-$(TARGET_AARCH64) += translate-sve.o sve_helper.o
|
||||
|
|
31
qemu/target/arm/translate-vfp.inc.c
Normal file
31
qemu/target/arm/translate-vfp.inc.c
Normal file
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* ARM translation: AArch32 VFP instructions
|
||||
*
|
||||
* Copyright (c) 2003 Fabrice Bellard
|
||||
* Copyright (c) 2005-2007 CodeSourcery
|
||||
* Copyright (c) 2007 OpenedHand, Ltd.
|
||||
* Copyright (c) 2019 Linaro, Ltd.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file is intended to be included from translate.c; it uses
|
||||
* some macros and definitions provided by that file.
|
||||
* It might be possible to convert it to a standalone .c file eventually.
|
||||
*/
|
||||
|
||||
/* Include the generated VFP decoder */
|
||||
#include "decode-vfp.inc.c"
|
||||
#include "decode-vfp-uncond.inc.c"
|
|
@ -1806,6 +1806,9 @@ static inline void gen_mov_vreg_F0(DisasContext *s, int dp, int reg)
|
|||
|
||||
#define ARM_CP_RW_BIT (1 << 20)
|
||||
|
||||
/* Include the VFP decoder */
|
||||
#include "translate-vfp.inc.c"
|
||||
|
||||
static inline void iwmmxt_load_reg(DisasContext *s, TCGv_i64 var, int reg)
|
||||
{
|
||||
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||
|
@ -3490,6 +3493,22 @@ static int disas_vfp_insn(DisasContext *s, uint32_t insn)
|
|||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* If the decodetree decoder handles this insn it will always
|
||||
* emit code to either execute the insn or generate an appropriate
|
||||
* exception; so we don't need to ever return non-zero to tell
|
||||
* the calling code to emit an UNDEF exception.
|
||||
*/
|
||||
if (extract32(insn, 28, 4) == 0xf) {
|
||||
if (disas_vfp_uncond(s, insn)) {
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
if (disas_vfp(s, insn)) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* FIXME: this access check should not take precedence over UNDEF
|
||||
* for invalid encodings; we will generate incorrect syndrome information
|
||||
* for attempts to execute invalid vfp/neon encodings with FP disabled.
|
||||
|
|
28
qemu/target/arm/vfp-uncond.decode
Normal file
28
qemu/target/arm/vfp-uncond.decode
Normal file
|
@ -0,0 +1,28 @@
|
|||
# AArch32 VFP instruction descriptions (unconditional insns)
|
||||
#
|
||||
# Copyright (c) 2019 Linaro, Ltd
|
||||
#
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public
|
||||
# License as published by the Free Software Foundation; either
|
||||
# version 2 of the License, or (at your option) any later version.
|
||||
#
|
||||
# This library is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#
|
||||
# This file is processed by scripts/decodetree.py
|
||||
#
|
||||
# Encodings for the unconditional VFP instructions are here:
|
||||
# generally anything matching A32
|
||||
# 1111 1110 .... .... .... 101. ...0 ....
|
||||
# and T32
|
||||
# 1111 110. .... .... .... 101. .... ....
|
||||
# 1111 1110 .... .... .... 101. .... ....
|
||||
# (but those patterns might also cover some Neon instructions,
|
||||
# which do not live in this file.)
|
28
qemu/target/arm/vfp.decode
Normal file
28
qemu/target/arm/vfp.decode
Normal file
|
@ -0,0 +1,28 @@
|
|||
# AArch32 VFP instruction descriptions (conditional insns)
|
||||
#
|
||||
# Copyright (c) 2019 Linaro, Ltd
|
||||
#
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public
|
||||
# License as published by the Free Software Foundation; either
|
||||
# version 2 of the License, or (at your option) any later version.
|
||||
#
|
||||
# This library is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#
|
||||
# This file is processed by scripts/decodetree.py
|
||||
#
|
||||
# Encodings for the conditional VFP instructions are here:
|
||||
# generally anything matching A32
|
||||
# cccc 11.. .... .... .... 101. .... ....
|
||||
# and T32
|
||||
# 1110 110. .... .... .... 101. .... ....
|
||||
# 1110 1110 .... .... .... 101. .... ....
|
||||
# (but those patterns might also cover some Neon instructions,
|
||||
# which do not live in this file.)
|
Loading…
Reference in a new issue