mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2024-12-25 01:25:28 +00:00
74040da34c
Document our choice about the T32 CONSTRAINED UNPREDICTABLE behaviour. This matches the undocumented choice made by the legacy decoder. Backports commit 4c97f5b2f0fa9b37f9ff497f15411d809e6fd098 from qemu
214 lines
10 KiB
Plaintext
214 lines
10 KiB
Plaintext
# A32 conditional instructions
|
|
#
|
|
# 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
|
|
#
|
|
# All of the insn that have a COND field in insn[31:28] are here.
|
|
# All insns that have 0xf in insn[31:28] are in a32-uncond.decode.
|
|
#
|
|
|
|
&empty
|
|
&s_rrr_shi s rd rn rm shim shty
|
|
&s_rrr_shr s rn rd rm rs shty
|
|
&s_rri_rot s rn rd imm rot
|
|
&s_rrrr s rd rn rm ra
|
|
&rrrr rd rn rm ra
|
|
&rrr rd rn rm
|
|
&rr rd rm
|
|
&r rm
|
|
&msr_reg rn r mask
|
|
&mrs_reg rd r
|
|
&msr_bank rn r sysm
|
|
&mrs_bank rd r sysm
|
|
|
|
# Data-processing (register)
|
|
|
|
@s_rrr_shi ---- ... .... s:1 rn:4 rd:4 shim:5 shty:2 . rm:4 \
|
|
&s_rrr_shi
|
|
@s_rxr_shi ---- ... .... s:1 .... rd:4 shim:5 shty:2 . rm:4 \
|
|
&s_rrr_shi rn=0
|
|
@S_xrr_shi ---- ... .... . rn:4 .... shim:5 shty:2 . rm:4 \
|
|
&s_rrr_shi s=1 rd=0
|
|
|
|
AND_rrri .... 000 0000 . .... .... ..... .. 0 .... @s_rrr_shi
|
|
EOR_rrri .... 000 0001 . .... .... ..... .. 0 .... @s_rrr_shi
|
|
SUB_rrri .... 000 0010 . .... .... ..... .. 0 .... @s_rrr_shi
|
|
RSB_rrri .... 000 0011 . .... .... ..... .. 0 .... @s_rrr_shi
|
|
ADD_rrri .... 000 0100 . .... .... ..... .. 0 .... @s_rrr_shi
|
|
ADC_rrri .... 000 0101 . .... .... ..... .. 0 .... @s_rrr_shi
|
|
SBC_rrri .... 000 0110 . .... .... ..... .. 0 .... @s_rrr_shi
|
|
RSC_rrri .... 000 0111 . .... .... ..... .. 0 .... @s_rrr_shi
|
|
TST_xrri .... 000 1000 1 .... 0000 ..... .. 0 .... @S_xrr_shi
|
|
TEQ_xrri .... 000 1001 1 .... 0000 ..... .. 0 .... @S_xrr_shi
|
|
CMP_xrri .... 000 1010 1 .... 0000 ..... .. 0 .... @S_xrr_shi
|
|
CMN_xrri .... 000 1011 1 .... 0000 ..... .. 0 .... @S_xrr_shi
|
|
ORR_rrri .... 000 1100 . .... .... ..... .. 0 .... @s_rrr_shi
|
|
MOV_rxri .... 000 1101 . 0000 .... ..... .. 0 .... @s_rxr_shi
|
|
BIC_rrri .... 000 1110 . .... .... ..... .. 0 .... @s_rrr_shi
|
|
MVN_rxri .... 000 1111 . 0000 .... ..... .. 0 .... @s_rxr_shi
|
|
|
|
# Data-processing (register-shifted register)
|
|
|
|
@s_rrr_shr ---- ... .... s:1 rn:4 rd:4 rs:4 . shty:2 . rm:4 \
|
|
&s_rrr_shr
|
|
@s_rxr_shr ---- ... .... s:1 .... rd:4 rs:4 . shty:2 . rm:4 \
|
|
&s_rrr_shr rn=0
|
|
@S_xrr_shr ---- ... .... . rn:4 .... rs:4 . shty:2 . rm:4 \
|
|
&s_rrr_shr rd=0 s=1
|
|
|
|
AND_rrrr .... 000 0000 . .... .... .... 0 .. 1 .... @s_rrr_shr
|
|
EOR_rrrr .... 000 0001 . .... .... .... 0 .. 1 .... @s_rrr_shr
|
|
SUB_rrrr .... 000 0010 . .... .... .... 0 .. 1 .... @s_rrr_shr
|
|
RSB_rrrr .... 000 0011 . .... .... .... 0 .. 1 .... @s_rrr_shr
|
|
ADD_rrrr .... 000 0100 . .... .... .... 0 .. 1 .... @s_rrr_shr
|
|
ADC_rrrr .... 000 0101 . .... .... .... 0 .. 1 .... @s_rrr_shr
|
|
SBC_rrrr .... 000 0110 . .... .... .... 0 .. 1 .... @s_rrr_shr
|
|
RSC_rrrr .... 000 0111 . .... .... .... 0 .. 1 .... @s_rrr_shr
|
|
TST_xrrr .... 000 1000 1 .... 0000 .... 0 .. 1 .... @S_xrr_shr
|
|
TEQ_xrrr .... 000 1001 1 .... 0000 .... 0 .. 1 .... @S_xrr_shr
|
|
CMP_xrrr .... 000 1010 1 .... 0000 .... 0 .. 1 .... @S_xrr_shr
|
|
CMN_xrrr .... 000 1011 1 .... 0000 .... 0 .. 1 .... @S_xrr_shr
|
|
ORR_rrrr .... 000 1100 . .... .... .... 0 .. 1 .... @s_rrr_shr
|
|
MOV_rxrr .... 000 1101 . 0000 .... .... 0 .. 1 .... @s_rxr_shr
|
|
BIC_rrrr .... 000 1110 . .... .... .... 0 .. 1 .... @s_rrr_shr
|
|
MVN_rxrr .... 000 1111 . 0000 .... .... 0 .. 1 .... @s_rxr_shr
|
|
|
|
# Data-processing (immediate)
|
|
|
|
%a32extrot 8:4 !function=times_2
|
|
|
|
@s_rri_rot ---- ... .... s:1 rn:4 rd:4 .... imm:8 \
|
|
&s_rri_rot rot=%a32extrot
|
|
@s_rxi_rot ---- ... .... s:1 .... rd:4 .... imm:8 \
|
|
&s_rri_rot rot=%a32extrot rn=0
|
|
@S_xri_rot ---- ... .... . rn:4 .... .... imm:8 \
|
|
&s_rri_rot rot=%a32extrot rd=0 s=1
|
|
|
|
AND_rri .... 001 0000 . .... .... ............ @s_rri_rot
|
|
EOR_rri .... 001 0001 . .... .... ............ @s_rri_rot
|
|
SUB_rri .... 001 0010 . .... .... ............ @s_rri_rot
|
|
RSB_rri .... 001 0011 . .... .... ............ @s_rri_rot
|
|
ADD_rri .... 001 0100 . .... .... ............ @s_rri_rot
|
|
ADC_rri .... 001 0101 . .... .... ............ @s_rri_rot
|
|
SBC_rri .... 001 0110 . .... .... ............ @s_rri_rot
|
|
RSC_rri .... 001 0111 . .... .... ............ @s_rri_rot
|
|
TST_xri .... 001 1000 1 .... 0000 ............ @S_xri_rot
|
|
TEQ_xri .... 001 1001 1 .... 0000 ............ @S_xri_rot
|
|
CMP_xri .... 001 1010 1 .... 0000 ............ @S_xri_rot
|
|
CMN_xri .... 001 1011 1 .... 0000 ............ @S_xri_rot
|
|
ORR_rri .... 001 1100 . .... .... ............ @s_rri_rot
|
|
MOV_rxi .... 001 1101 . 0000 .... ............ @s_rxi_rot
|
|
BIC_rri .... 001 1110 . .... .... ............ @s_rri_rot
|
|
MVN_rxi .... 001 1111 . 0000 .... ............ @s_rxi_rot
|
|
|
|
# Multiply and multiply accumulate
|
|
|
|
@s_rdamn ---- .... ... s:1 rd:4 ra:4 rm:4 .... rn:4 &s_rrrr
|
|
@s_rd0mn ---- .... ... s:1 rd:4 .... rm:4 .... rn:4 &s_rrrr ra=0
|
|
@rdamn ---- .... ... . rd:4 ra:4 rm:4 .... rn:4 &rrrr
|
|
@rd0mn ---- .... ... . rd:4 .... rm:4 .... rn:4 &rrrr ra=0
|
|
|
|
MUL .... 0000 000 . .... 0000 .... 1001 .... @s_rd0mn
|
|
MLA .... 0000 001 . .... .... .... 1001 .... @s_rdamn
|
|
UMAAL .... 0000 010 0 .... .... .... 1001 .... @rdamn
|
|
MLS .... 0000 011 0 .... .... .... 1001 .... @rdamn
|
|
UMULL .... 0000 100 . .... .... .... 1001 .... @s_rdamn
|
|
UMLAL .... 0000 101 . .... .... .... 1001 .... @s_rdamn
|
|
SMULL .... 0000 110 . .... .... .... 1001 .... @s_rdamn
|
|
SMLAL .... 0000 111 . .... .... .... 1001 .... @s_rdamn
|
|
|
|
# Saturating addition and subtraction
|
|
|
|
@rndm ---- .... .... rn:4 rd:4 .... .... rm:4 &rrr
|
|
|
|
QADD .... 0001 0000 .... .... 0000 0101 .... @rndm
|
|
QSUB .... 0001 0010 .... .... 0000 0101 .... @rndm
|
|
QDADD .... 0001 0100 .... .... 0000 0101 .... @rndm
|
|
QDSUB .... 0001 0110 .... .... 0000 0101 .... @rndm
|
|
|
|
# Halfword multiply and multiply accumulate
|
|
|
|
SMLABB .... 0001 0000 .... .... .... 1000 .... @rdamn
|
|
SMLABT .... 0001 0000 .... .... .... 1100 .... @rdamn
|
|
SMLATB .... 0001 0000 .... .... .... 1010 .... @rdamn
|
|
SMLATT .... 0001 0000 .... .... .... 1110 .... @rdamn
|
|
SMLAWB .... 0001 0010 .... .... .... 1000 .... @rdamn
|
|
SMULWB .... 0001 0010 .... 0000 .... 1010 .... @rd0mn
|
|
SMLAWT .... 0001 0010 .... .... .... 1100 .... @rdamn
|
|
SMULWT .... 0001 0010 .... 0000 .... 1110 .... @rd0mn
|
|
SMLALBB .... 0001 0100 .... .... .... 1000 .... @rdamn
|
|
SMLALBT .... 0001 0100 .... .... .... 1100 .... @rdamn
|
|
SMLALTB .... 0001 0100 .... .... .... 1010 .... @rdamn
|
|
SMLALTT .... 0001 0100 .... .... .... 1110 .... @rdamn
|
|
SMULBB .... 0001 0110 .... 0000 .... 1000 .... @rd0mn
|
|
SMULBT .... 0001 0110 .... 0000 .... 1100 .... @rd0mn
|
|
SMULTB .... 0001 0110 .... 0000 .... 1010 .... @rd0mn
|
|
SMULTT .... 0001 0110 .... 0000 .... 1110 .... @rd0mn
|
|
|
|
# MSR (immediate) and hints
|
|
|
|
&msr_i r mask rot imm
|
|
@msr_i ---- .... .... mask:4 .... rot:4 imm:8 &msr_i
|
|
|
|
{
|
|
{
|
|
YIELD ---- 0011 0010 0000 1111 ---- 0000 0001
|
|
WFE ---- 0011 0010 0000 1111 ---- 0000 0010
|
|
WFI ---- 0011 0010 0000 1111 ---- 0000 0011
|
|
|
|
# TODO: Implement SEV, SEVL; may help SMP performance.
|
|
# SEV ---- 0011 0010 0000 1111 ---- 0000 0100
|
|
# SEVL ---- 0011 0010 0000 1111 ---- 0000 0101
|
|
|
|
# The canonical nop ends in 00000000, but the whole of the
|
|
# rest of the space executes as nop if otherwise unsupported.
|
|
NOP ---- 0011 0010 0000 1111 ---- ---- ----
|
|
}
|
|
# Note mask = 0 is covered by NOP
|
|
MSR_imm .... 0011 0010 .... 1111 .... .... .... @msr_i r=0
|
|
}
|
|
MSR_imm .... 0011 0110 .... 1111 .... .... .... @msr_i r=1
|
|
|
|
# Cyclic Redundancy Check
|
|
|
|
CRC32B .... 0001 0000 .... .... 0000 0100 .... @rndm
|
|
CRC32H .... 0001 0010 .... .... 0000 0100 .... @rndm
|
|
CRC32W .... 0001 0100 .... .... 0000 0100 .... @rndm
|
|
CRC32CB .... 0001 0000 .... .... 0010 0100 .... @rndm
|
|
CRC32CH .... 0001 0010 .... .... 0010 0100 .... @rndm
|
|
CRC32CW .... 0001 0100 .... .... 0010 0100 .... @rndm
|
|
|
|
# Miscellaneous instructions
|
|
|
|
%sysm 8:1 16:4
|
|
|
|
@rm ---- .... .... .... .... .... .... rm:4 &r
|
|
@rdm ---- .... .... .... rd:4 .... .... rm:4 &rr
|
|
|
|
MRS_bank ---- 0001 0 r:1 00 .... rd:4 001. 0000 0000 &mrs_bank %sysm
|
|
MSR_bank ---- 0001 0 r:1 10 .... 1111 001. 0000 rn:4 &msr_bank %sysm
|
|
|
|
MRS_reg ---- 0001 0 r:1 00 1111 rd:4 0000 0000 0000 &mrs_reg
|
|
MSR_reg ---- 0001 0 r:1 10 mask:4 1111 0000 0000 rn:4 &msr_reg
|
|
|
|
BX .... 0001 0010 1111 1111 1111 0001 .... @rm
|
|
BXJ .... 0001 0010 1111 1111 1111 0010 .... @rm
|
|
BLX_r .... 0001 0010 1111 1111 1111 0011 .... @rm
|
|
|
|
CLZ .... 0001 0110 1111 .... 1111 0001 .... @rdm
|