4ed95abd70
Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20190904193059.26202-16-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
217 lines
8.6 KiB
Plaintext
217 lines
8.6 KiB
Plaintext
# Thumb2 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
|
|
#
|
|
|
|
&empty !extern
|
|
&s_rrr_shi !extern s rd rn rm shim shty
|
|
&s_rrr_shr !extern s rn rd rm rs shty
|
|
&s_rri_rot !extern s rn rd imm rot
|
|
&s_rrrr !extern s rd rn rm ra
|
|
&rrrr !extern rd rn rm ra
|
|
&rrr !extern rd rn rm
|
|
&r !extern rm
|
|
&msr_reg !extern rn r mask
|
|
&mrs_reg !extern rd r
|
|
&msr_bank !extern rn r sysm
|
|
&mrs_bank !extern rd r sysm
|
|
|
|
# Data-processing (register)
|
|
|
|
%imm5_12_6 12:3 6:2
|
|
|
|
@s_rrr_shi ....... .... s:1 rn:4 .... rd:4 .. shty:2 rm:4 \
|
|
&s_rrr_shi shim=%imm5_12_6
|
|
@s_rxr_shi ....... .... s:1 .... .... rd:4 .. shty:2 rm:4 \
|
|
&s_rrr_shi shim=%imm5_12_6 rn=0
|
|
@S_xrr_shi ....... .... . rn:4 .... .... .. shty:2 rm:4 \
|
|
&s_rrr_shi shim=%imm5_12_6 s=1 rd=0
|
|
|
|
{
|
|
TST_xrri 1110101 0000 1 .... 0 ... 1111 .... .... @S_xrr_shi
|
|
AND_rrri 1110101 0000 . .... 0 ... .... .... .... @s_rrr_shi
|
|
}
|
|
BIC_rrri 1110101 0001 . .... 0 ... .... .... .... @s_rrr_shi
|
|
{
|
|
MOV_rxri 1110101 0010 . 1111 0 ... .... .... .... @s_rxr_shi
|
|
ORR_rrri 1110101 0010 . .... 0 ... .... .... .... @s_rrr_shi
|
|
}
|
|
{
|
|
MVN_rxri 1110101 0011 . 1111 0 ... .... .... .... @s_rxr_shi
|
|
ORN_rrri 1110101 0011 . .... 0 ... .... .... .... @s_rrr_shi
|
|
}
|
|
{
|
|
TEQ_xrri 1110101 0100 1 .... 0 ... 1111 .... .... @S_xrr_shi
|
|
EOR_rrri 1110101 0100 . .... 0 ... .... .... .... @s_rrr_shi
|
|
}
|
|
# PKHBT, PKHTB at opc1 = 0110
|
|
{
|
|
CMN_xrri 1110101 1000 1 .... 0 ... 1111 .... .... @S_xrr_shi
|
|
ADD_rrri 1110101 1000 . .... 0 ... .... .... .... @s_rrr_shi
|
|
}
|
|
ADC_rrri 1110101 1010 . .... 0 ... .... .... .... @s_rrr_shi
|
|
SBC_rrri 1110101 1011 . .... 0 ... .... .... .... @s_rrr_shi
|
|
{
|
|
CMP_xrri 1110101 1101 1 .... 0 ... 1111 .... .... @S_xrr_shi
|
|
SUB_rrri 1110101 1101 . .... 0 ... .... .... .... @s_rrr_shi
|
|
}
|
|
RSB_rrri 1110101 1110 . .... 0 ... .... .... .... @s_rrr_shi
|
|
|
|
# Data-processing (register-shifted register)
|
|
|
|
MOV_rxrr 1111 1010 0 shty:2 s:1 rm:4 1111 rd:4 0000 rs:4 \
|
|
&s_rrr_shr rn=0
|
|
|
|
# Data-processing (immediate)
|
|
|
|
%t32extrot 26:1 12:3 0:8 !function=t32_expandimm_rot
|
|
%t32extimm 26:1 12:3 0:8 !function=t32_expandimm_imm
|
|
|
|
@s_rri_rot ....... .... s:1 rn:4 . ... rd:4 ........ \
|
|
&s_rri_rot imm=%t32extimm rot=%t32extrot
|
|
@s_rxi_rot ....... .... s:1 .... . ... rd:4 ........ \
|
|
&s_rri_rot imm=%t32extimm rot=%t32extrot rn=0
|
|
@S_xri_rot ....... .... . rn:4 . ... .... ........ \
|
|
&s_rri_rot imm=%t32extimm rot=%t32extrot s=1 rd=0
|
|
|
|
{
|
|
TST_xri 1111 0.0 0000 1 .... 0 ... 1111 ........ @S_xri_rot
|
|
AND_rri 1111 0.0 0000 . .... 0 ... .... ........ @s_rri_rot
|
|
}
|
|
BIC_rri 1111 0.0 0001 . .... 0 ... .... ........ @s_rri_rot
|
|
{
|
|
MOV_rxi 1111 0.0 0010 . 1111 0 ... .... ........ @s_rxi_rot
|
|
ORR_rri 1111 0.0 0010 . .... 0 ... .... ........ @s_rri_rot
|
|
}
|
|
{
|
|
MVN_rxi 1111 0.0 0011 . 1111 0 ... .... ........ @s_rxi_rot
|
|
ORN_rri 1111 0.0 0011 . .... 0 ... .... ........ @s_rri_rot
|
|
}
|
|
{
|
|
TEQ_xri 1111 0.0 0100 1 .... 0 ... 1111 ........ @S_xri_rot
|
|
EOR_rri 1111 0.0 0100 . .... 0 ... .... ........ @s_rri_rot
|
|
}
|
|
{
|
|
CMN_xri 1111 0.0 1000 1 .... 0 ... 1111 ........ @S_xri_rot
|
|
ADD_rri 1111 0.0 1000 . .... 0 ... .... ........ @s_rri_rot
|
|
}
|
|
ADC_rri 1111 0.0 1010 . .... 0 ... .... ........ @s_rri_rot
|
|
SBC_rri 1111 0.0 1011 . .... 0 ... .... ........ @s_rri_rot
|
|
{
|
|
CMP_xri 1111 0.0 1101 1 .... 0 ... 1111 ........ @S_xri_rot
|
|
SUB_rri 1111 0.0 1101 . .... 0 ... .... ........ @s_rri_rot
|
|
}
|
|
RSB_rri 1111 0.0 1110 . .... 0 ... .... ........ @s_rri_rot
|
|
|
|
# Multiply and multiply accumulate
|
|
|
|
@s0_rnadm .... .... .... rn:4 ra:4 rd:4 .... rm:4 &s_rrrr s=0
|
|
@s0_rn0dm .... .... .... rn:4 .... rd:4 .... rm:4 &s_rrrr ra=0 s=0
|
|
@rnadm .... .... .... rn:4 ra:4 rd:4 .... rm:4 &rrrr
|
|
@rn0dm .... .... .... rn:4 .... rd:4 .... rm:4 &rrrr ra=0
|
|
@rndm .... .... .... rn:4 .... rd:4 .... rm:4 &rrr
|
|
|
|
{
|
|
MUL 1111 1011 0000 .... 1111 .... 0000 .... @s0_rn0dm
|
|
MLA 1111 1011 0000 .... .... .... 0000 .... @s0_rnadm
|
|
}
|
|
MLS 1111 1011 0000 .... .... .... 0001 .... @rnadm
|
|
SMULL 1111 1011 1000 .... .... .... 0000 .... @s0_rnadm
|
|
UMULL 1111 1011 1010 .... .... .... 0000 .... @s0_rnadm
|
|
SMLAL 1111 1011 1100 .... .... .... 0000 .... @s0_rnadm
|
|
UMLAL 1111 1011 1110 .... .... .... 0000 .... @s0_rnadm
|
|
UMAAL 1111 1011 1110 .... .... .... 0110 .... @rnadm
|
|
{
|
|
SMULWB 1111 1011 0011 .... 1111 .... 0000 .... @rn0dm
|
|
SMLAWB 1111 1011 0011 .... .... .... 0000 .... @rnadm
|
|
}
|
|
{
|
|
SMULWT 1111 1011 0011 .... 1111 .... 0001 .... @rn0dm
|
|
SMLAWT 1111 1011 0011 .... .... .... 0001 .... @rnadm
|
|
}
|
|
{
|
|
SMULBB 1111 1011 0001 .... 1111 .... 0000 .... @rn0dm
|
|
SMLABB 1111 1011 0001 .... .... .... 0000 .... @rnadm
|
|
}
|
|
{
|
|
SMULBT 1111 1011 0001 .... 1111 .... 0001 .... @rn0dm
|
|
SMLABT 1111 1011 0001 .... .... .... 0001 .... @rnadm
|
|
}
|
|
{
|
|
SMULTB 1111 1011 0001 .... 1111 .... 0010 .... @rn0dm
|
|
SMLATB 1111 1011 0001 .... .... .... 0010 .... @rnadm
|
|
}
|
|
{
|
|
SMULTT 1111 1011 0001 .... 1111 .... 0011 .... @rn0dm
|
|
SMLATT 1111 1011 0001 .... .... .... 0011 .... @rnadm
|
|
}
|
|
SMLALBB 1111 1011 1100 .... .... .... 1000 .... @rnadm
|
|
SMLALBT 1111 1011 1100 .... .... .... 1001 .... @rnadm
|
|
SMLALTB 1111 1011 1100 .... .... .... 1010 .... @rnadm
|
|
SMLALTT 1111 1011 1100 .... .... .... 1011 .... @rnadm
|
|
|
|
# Data-processing (two source registers)
|
|
|
|
QADD 1111 1010 1000 .... 1111 .... 1000 .... @rndm
|
|
QSUB 1111 1010 1000 .... 1111 .... 1010 .... @rndm
|
|
QDADD 1111 1010 1000 .... 1111 .... 1001 .... @rndm
|
|
QDSUB 1111 1010 1000 .... 1111 .... 1011 .... @rndm
|
|
|
|
CRC32B 1111 1010 1100 .... 1111 .... 1000 .... @rndm
|
|
CRC32H 1111 1010 1100 .... 1111 .... 1001 .... @rndm
|
|
CRC32W 1111 1010 1100 .... 1111 .... 1010 .... @rndm
|
|
CRC32CB 1111 1010 1101 .... 1111 .... 1000 .... @rndm
|
|
CRC32CH 1111 1010 1101 .... 1111 .... 1001 .... @rndm
|
|
CRC32CW 1111 1010 1101 .... 1111 .... 1010 .... @rndm
|
|
|
|
# Branches and miscellaneous control
|
|
|
|
%msr_sysm 4:1 8:4
|
|
%mrs_sysm 4:1 16:4
|
|
|
|
{
|
|
{
|
|
YIELD 1111 0011 1010 1111 1000 0000 0000 0001
|
|
WFE 1111 0011 1010 1111 1000 0000 0000 0010
|
|
WFI 1111 0011 1010 1111 1000 0000 0000 0011
|
|
|
|
# TODO: Implement SEV, SEVL; may help SMP performance.
|
|
# SEV 1111 0011 1010 1111 1000 0000 0000 0100
|
|
# SEVL 1111 0011 1010 1111 1000 0000 0000 0101
|
|
|
|
# The canonical nop ends in 0000 0000, but the whole rest
|
|
# of the space is "reserved hint, behaves as nop".
|
|
NOP 1111 0011 1010 1111 1000 0000 ---- ----
|
|
}
|
|
# Note that the v7m insn overlaps both the normal and banked insn.
|
|
{
|
|
MRS_bank 1111 0011 111 r:1 .... 1000 rd:4 001. 0000 \
|
|
&mrs_bank sysm=%mrs_sysm
|
|
MRS_reg 1111 0011 111 r:1 1111 1000 rd:4 0000 0000 &mrs_reg
|
|
MRS_v7m 1111 0011 111 0 1111 1000 rd:4 sysm:8
|
|
}
|
|
{
|
|
MSR_bank 1111 0011 100 r:1 rn:4 1000 .... 001. 0000 \
|
|
&msr_bank sysm=%msr_sysm
|
|
MSR_reg 1111 0011 100 r:1 rn:4 1000 mask:4 0000 0000 &msr_reg
|
|
MSR_v7m 1111 0011 100 0 rn:4 1000 mask:2 00 sysm:8
|
|
}
|
|
BXJ 1111 0011 1100 rm:4 1000 1111 0000 0000 &r
|
|
}
|