summaryrefslogblamecommitdiffstats
path: root/target/arm/t32.decode
blob: f045eb62c84b349cddc2e32d7d4cd9e251927670 (plain) (tree)
1
2
3
4
5
6
7
8






                                                               
                                                                    











                                                                              
 
                        
                                             
                                           
                                        

                                      
                                     
                                 
                              
                               
                           
                            



                                  

                                                    
                                        

                                         

                                          

                                            
                                          

                                                




























                                                                        

                                                                










                                                                        
 


                                                              



                                                                  








































                                                                        
 

















                                                                        








                                                                    

                    













                                                                    










                                                                  




                                                                              
                                                                        
                                                                  
                                                                 










                                                                       



























                                                                    
 


                                                                    

















                                                                    





                                                                   
 






                                                                   

                                                                   
                                                                     



                                                                  

                                                                  

                                    

                         
                          

                                                            

 

                                                                     

                    











                                                               
 

                                                                           
                     
     
 
                           




                                                        
 


                                                                      
                                         




                                                                       
                                         









                                                                               
                                                 


                                                                
                                   
                                                         
   
                                                                            
 









































































































































                                                                             



                                                                             
 
                                                                    














                                                           



                                                                      

























                                                                      
 





                                                                      










































                                                                   










                                                                      






                                                                             




                                                                            
                                                                            
 











                                                                       
















                                                                      






                                                                           










                                                                          







                                                                          
 
# 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.1 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_rot         !extern rd rn rm rot
&rrr             !extern rd rn rm
&rr              !extern rd rm
&ri              !extern rd imm
&r               !extern rm
&i               !extern imm
&msr_reg         !extern rn r mask
&mrs_reg         !extern rd r
&msr_bank        !extern rn r sysm
&mrs_bank        !extern rd r sysm
&ldst_rr         !extern p w u rn rt rm shimm shtype
&ldst_ri         !extern p w u rn rt imm
&ldst_block      !extern rn i b u w list
&strex           !extern rn rd rt rt2 imm
&ldrex           !extern rn rt rt2 imm
&bfx             !extern rd rn lsb widthm1
&bfi             !extern rd rn lsb msb
&sat             !extern rd rn satimm imm sh
&pkh             !extern rd rn rm imm tb
&cps             !extern mode imod M A I F
&mcr             !extern cp opc1 crn crm opc2 rt
&mcrr            !extern cp opc1 crm rt rt2

# 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
}
PKH              1110101 0110 0 rn:4 0 ... rd:4 .. tb:1 0 rm:4 \
                 &pkh imm=%imm5_12_6
{
  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

# v8.1M CSEL and friends
CSEL             1110101 0010 1 rn:4 10 op:2 rd:4 fcond:4 rm:4

# 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

# Data processing (plain binary immediate)

%imm12_26_12_0   26:1 12:3 0:8
%neg12_26_12_0   26:1 12:3 0:8 !function=negate
@s0_rri_12       .... ... .... . rn:4 . ... rd:4 ........ \
                 &s_rri_rot imm=%imm12_26_12_0 rot=0 s=0

{
  ADR            1111 0.1 0000 0 1111 0 ... rd:4 ........ \
                 &ri imm=%imm12_26_12_0
  ADD_rri        1111 0.1 0000 0 .... 0 ... .... ........     @s0_rri_12
}
{
  ADR            1111 0.1 0101 0 1111 0 ... rd:4 ........ \
                 &ri imm=%neg12_26_12_0
  SUB_rri        1111 0.1 0101 0 .... 0 ... .... ........     @s0_rri_12
}

# Move Wide

%imm16_26_16_12_0 16:4 26:1 12:3 0:8
@mov16           .... .... .... .... .... rd:4 .... .... \
                 &ri imm=%imm16_26_16_12_0

MOVW             1111 0.10 0100 .... 0 ... .... ........      @mov16
MOVT             1111 0.10 1100 .... 0 ... .... ........      @mov16

# Saturate, bitfield

@sat             .... .... .. sh:1 . rn:4 . ... rd:4 .. . satimm:5 \
                 &sat imm=%imm5_12_6
@sat16           .... .... .. .    . rn:4 . ... rd:4 .. . satimm:5 \
                 &sat sh=0 imm=0

{
  SSAT16         1111 0011 001 0 .... 0 000 .... 00 0 .....   @sat16
  SSAT           1111 0011 00. 0 .... 0 ... .... .. 0 .....   @sat
}
{
  USAT16         1111 0011 101 0 .... 0 000 .... 00 0 .....   @sat16
  USAT           1111 0011 10. 0 .... 0 ... .... .. 0 .....   @sat
}

@bfx             .... .... ... . rn:4 . ... rd:4 .. . widthm1:5 \
                 &bfx lsb=%imm5_12_6
@bfi             .... .... ... . rn:4 . ... rd:4 .. . msb:5 \
                 &bfi lsb=%imm5_12_6

SBFX             1111 0011 010 0 .... 0 ... .... ..0.....     @bfx
UBFX             1111 0011 110 0 .... 0 ... .... ..0.....     @bfx

# bfc is bfi w/ rn=15
BFCI             1111 0011 011 0 .... 0 ... .... ..0.....     @bfi

# 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
@rdm             .... .... .... .... .... rd:4 .... rm:4      &rr

{
  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

# usad8 is usada8 w/ ra=15
USADA8           1111 1011 0111 .... .... .... 0000 ....      @rnadm

SMLAD            1111 1011 0010 .... .... .... 0000 ....      @rnadm
SMLADX           1111 1011 0010 .... .... .... 0001 ....      @rnadm
SMLSD            1111 1011 0100 .... .... .... 0000 ....      @rnadm
SMLSDX           1111 1011 0100 .... .... .... 0001 ....      @rnadm

SMLALD           1111 1011 1100 .... .... .... 1100 ....      @rnadm
SMLALDX          1111 1011 1100 .... .... .... 1101 ....      @rnadm
SMLSLD           1111 1011 1101 .... .... .... 1100 ....      @rnadm
SMLSLDX          1111 1011 1101 .... .... .... 1101 ....      @rnadm

SMMLA            1111 1011 0101 .... .... .... 0000 ....      @rnadm
SMMLAR           1111 1011 0101 .... .... .... 0001 ....      @rnadm
SMMLS            1111 1011 0110 .... .... .... 0000 ....      @rnadm
SMMLSR           1111 1011 0110 .... .... .... 0001 ....      @rnadm

SDIV             1111 1011 1001 .... 1111 .... 1111 ....      @rndm
UDIV             1111 1011 1011 .... 1111 .... 1111 ....      @rndm

# 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

SEL              1111 1010 1010 .... 1111 .... 1000 ....      @rndm

# Note rn != rm is CONSTRAINED UNPREDICTABLE; we choose to ignore rn.
REV              1111 1010 1001 ---- 1111 .... 1000 ....      @rdm
REV16            1111 1010 1001 ---- 1111 .... 1001 ....      @rdm
RBIT             1111 1010 1001 ---- 1111 .... 1010 ....      @rdm
REVSH            1111 1010 1001 ---- 1111 .... 1011 ....      @rdm
CLZ              1111 1010 1011 ---- 1111 .... 1000 ....      @rdm

# Branches and miscellaneous control

%msr_sysm        4:1 8:4
%mrs_sysm        4:1 16:4
%imm16_16_0      16:4 0:12
%imm21           26:s1 11:1 13:1 16:6 0:11 !function=times_2
&ci              cond imm

{
  # Group insn[25:23] = 111, which is cond=111x for the branch below,
  # or unconditional, which would be illegal for the branch.
  [
    # Hints, and CPS
    {
      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 ---- ----

      # If imod == '00' && M == '0' then SEE "Hint instructions", above.
      CPS        1111 0011 1010 1111 1000 0 imod:2 M:1 A:1 I:1 F:1 mode:5 \
                 &cps
    }

    # Miscellaneous control
    CLREX        1111 0011 1011 1111 1000 1111 0010 1111
    DSB          1111 0011 1011 1111 1000 1111 0100 ----
    DMB          1111 0011 1011 1111 1000 1111 0101 ----
    ISB          1111 0011 1011 1111 1000 1111 0110 ----
    SB           1111 0011 1011 1111 1000 1111 0111 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
    {
      # At v6T2, this is the T5 encoding of SUBS PC, LR, #IMM, and works as for
      # every other encoding of SUBS.  With v7VE, IMM=0 is redefined as ERET.
      # The distinction between the two only matters for Hyp mode.
      ERET       1111 0011 1101 1110 1000 1111 0000 0000
      SUB_rri    1111 0011 1101 1110 1000 1111 imm:8 \
                 &s_rri_rot rot=0 s=1 rd=15 rn=14
    }
    SMC          1111 0111 1111 imm:4 1000 0000 0000 0000     &i
    HVC          1111 0111 1110 ....  1000 .... .... ....     \
                 &i imm=%imm16_16_0
    UDF          1111 0111 1111 ----  1010 ---- ---- ----
  ]
  B_cond_thumb   1111 0. cond:4 ...... 10.0 ............      &ci imm=%imm21
}

# Load/store (register, immediate, literal)

@ldst_rr         .... .... .... rn:4 rt:4 ...... shimm:2 rm:4 \
                 &ldst_rr p=1 w=0 u=1 shtype=0
@ldst_ri_idx     .... .... .... rn:4 rt:4 . p:1 u:1 . imm:8 \
                 &ldst_ri w=1
@ldst_ri_neg     .... .... .... rn:4 rt:4 .... imm:8 \
                 &ldst_ri p=1 w=0 u=0
@ldst_ri_unp     .... .... .... rn:4 rt:4 .... imm:8 \
                 &ldst_ri p=1 w=0 u=1
@ldst_ri_pos     .... .... .... rn:4 rt:4 imm:12 \
                 &ldst_ri p=1 w=0 u=1
@ldst_ri_lit     .... .... u:1 ... .... rt:4 imm:12 \
                 &ldst_ri p=1 w=0 rn=15

STRB_rr          1111 1000 0000 .... .... 000000 .. ....      @ldst_rr
STRB_ri          1111 1000 0000 .... .... 1..1 ........       @ldst_ri_idx
STRB_ri          1111 1000 0000 .... .... 1100 ........       @ldst_ri_neg
STRBT_ri         1111 1000 0000 .... .... 1110 ........       @ldst_ri_unp
STRB_ri          1111 1000 1000 .... .... ............        @ldst_ri_pos

STRH_rr          1111 1000 0010 .... .... 000000 .. ....      @ldst_rr
STRH_ri          1111 1000 0010 .... .... 1..1 ........       @ldst_ri_idx
STRH_ri          1111 1000 0010 .... .... 1100 ........       @ldst_ri_neg
STRHT_ri         1111 1000 0010 .... .... 1110 ........       @ldst_ri_unp
STRH_ri          1111 1000 1010 .... .... ............        @ldst_ri_pos

STR_rr           1111 1000 0100 .... .... 000000 .. ....      @ldst_rr
STR_ri           1111 1000 0100 .... .... 1..1 ........       @ldst_ri_idx
STR_ri           1111 1000 0100 .... .... 1100 ........       @ldst_ri_neg
STRT_ri          1111 1000 0100 .... .... 1110 ........       @ldst_ri_unp
STR_ri           1111 1000 1100 .... .... ............        @ldst_ri_pos

# Note that Load, unsigned (literal) overlaps all other load encodings.
{
  {
    NOP          1111 1000 -001 1111 1111 ------------        # PLD
    LDRB_ri      1111 1000 .001 1111 .... ............        @ldst_ri_lit
  }
  {
    NOP          1111 1000 1001 ---- 1111 ------------        # PLD
    LDRB_ri      1111 1000 1001 .... .... ............        @ldst_ri_pos
  }
  LDRB_ri        1111 1000 0001 .... .... 1..1 ........       @ldst_ri_idx
  {
    NOP          1111 1000 0001 ---- 1111 1100 --------       # PLD
    LDRB_ri      1111 1000 0001 .... .... 1100 ........       @ldst_ri_neg
  }
  LDRBT_ri       1111 1000 0001 .... .... 1110 ........       @ldst_ri_unp
  {
    NOP          1111 1000 0001 ---- 1111 000000 -- ----      # PLD
    LDRB_rr      1111 1000 0001 .... .... 000000 .. ....      @ldst_rr
  }
}
{
  {
    NOP          1111 1000 -011 1111 1111 ------------        # PLD
    LDRH_ri      1111 1000 .011 1111 .... ............        @ldst_ri_lit
  }
  {
    NOP          1111 1000 1011 ---- 1111 ------------        # PLDW
    LDRH_ri      1111 1000 1011 .... .... ............        @ldst_ri_pos
  }
  LDRH_ri        1111 1000 0011 .... .... 1..1 ........       @ldst_ri_idx
  {
    NOP          1111 1000 0011 ---- 1111 1100 --------       # PLDW
    LDRH_ri      1111 1000 0011 .... .... 1100 ........       @ldst_ri_neg
  }
  LDRHT_ri       1111 1000 0011 .... .... 1110 ........       @ldst_ri_unp
  {
    NOP          1111 1000 0011 ---- 1111 000000 -- ----      # PLDW
    LDRH_rr      1111 1000 0011 .... .... 000000 .. ....      @ldst_rr
  }
}
{
  LDR_ri         1111 1000 .101 1111 .... ............        @ldst_ri_lit
  LDR_ri         1111 1000 1101 .... .... ............        @ldst_ri_pos
  LDR_ri         1111 1000 0101 .... .... 1..1 ........       @ldst_ri_idx
  LDR_ri         1111 1000 0101 .... .... 1100 ........       @ldst_ri_neg
  LDRT_ri        1111 1000 0101 .... .... 1110 ........       @ldst_ri_unp
  LDR_rr         1111 1000 0101 .... .... 000000 .. ....      @ldst_rr
}
# NOPs here are PLI.
{
  {
    NOP          1111 1001 -001 1111 1111 ------------
    LDRSB_ri     1111 1001 .001 1111 .... ............        @ldst_ri_lit
  }
  {
    NOP          1111 1001 1001 ---- 1111 ------------
    LDRSB_ri     1111 1001 1001 .... .... ............        @ldst_ri_pos
  }
  LDRSB_ri       1111 1001 0001 .... .... 1..1 ........       @ldst_ri_idx
  {
    NOP          1111 1001 0001 ---- 1111 1100 --------
    LDRSB_ri     1111 1001 0001 .... .... 1100 ........       @ldst_ri_neg
  }
  LDRSBT_ri      1111 1001 0001 .... .... 1110 ........       @ldst_ri_unp
  {
    NOP          1111 1001 0001 ---- 1111 000000 -- ----
    LDRSB_rr     1111 1001 0001 .... .... 000000 .. ....      @ldst_rr
  }
}
# NOPs here are unallocated memory hints, treated as NOP.
{
  {
    NOP          1111 1001 -011 1111 1111 ------------
    LDRSH_ri     1111 1001 .011 1111 .... ............        @ldst_ri_lit
  }
  {
    NOP          1111 1001 1011 ---- 1111 ------------
    LDRSH_ri     1111 1001 1011 .... .... ............        @ldst_ri_pos
  }
  LDRSH_ri       1111 1001 0011 .... .... 1..1 ........       @ldst_ri_idx
  {
    NOP          1111 1001 0011 ---- 1111 1100 --------
    LDRSH_ri     1111 1001 0011 .... .... 1100 ........       @ldst_ri_neg
  }
  LDRSHT_ri      1111 1001 0011 .... .... 1110 ........       @ldst_ri_unp
  {
    NOP          1111 1001 0011 ---- 1111 000000 -- ----
    LDRSH_rr     1111 1001 0011 .... .... 000000 .. ....      @ldst_rr
  }
}

%imm8x4          0:8 !function=times_4
&ldst_ri2        p w u rn rt rt2 imm
@ldstd_ri8       .... .... u:1 ... rn:4 rt:4 rt2:4 ........   \
                 &ldst_ri2 imm=%imm8x4

STRD_ri_t32      1110 1000 .110 .... .... .... ........    @ldstd_ri8 w=1 p=0
LDRD_ri_t32      1110 1000 .111 .... .... .... ........    @ldstd_ri8 w=1 p=0

STRD_ri_t32      1110 1001 .100 .... .... .... ........    @ldstd_ri8 w=0 p=1
LDRD_ri_t32      1110 1001 .101 .... .... .... ........    @ldstd_ri8 w=0 p=1

STRD_ri_t32      1110 1001 .110 .... .... .... ........    @ldstd_ri8 w=1 p=1
{
  SG             1110 1001 0111 1111 1110 1001 01111111
  LDRD_ri_t32    1110 1001 .111 .... .... .... ........    @ldstd_ri8 w=1 p=1
}

# Load/Store Exclusive, Load-Acquire/Store-Release, and Table Branch

@strex_i         .... .... .... rn:4 rt:4 rd:4 .... .... \
                 &strex rt2=15 imm=%imm8x4
@strex_0         .... .... .... rn:4 rt:4 .... .... rd:4 \
                 &strex rt2=15 imm=0
@strex_d         .... .... .... rn:4 rt:4 rt2:4 .... rd:4 \
                 &strex imm=0

@ldrex_i         .... .... .... rn:4 rt:4 .... .... .... \
                 &ldrex rt2=15 imm=%imm8x4
@ldrex_0         .... .... .... rn:4 rt:4 .... .... .... \
                 &ldrex rt2=15 imm=0
@ldrex_d         .... .... .... rn:4 rt:4 rt2:4 .... .... \
                 &ldrex imm=0

{
  TT             1110 1000 0100 rn:4 1111 rd:4 A:1 T:1 000000
  STREX          1110 1000 0100 .... .... .... .... ....      @strex_i
}
STREXB           1110 1000 1100 .... .... 1111 0100 ....      @strex_0
STREXH           1110 1000 1100 .... .... 1111 0101 ....      @strex_0
STREXD_t32       1110 1000 1100 .... .... .... 0111 ....      @strex_d

STLEX            1110 1000 1100 .... .... 1111 1110 ....      @strex_0
STLEXB           1110 1000 1100 .... .... 1111 1100 ....      @strex_0
STLEXH           1110 1000 1100 .... .... 1111 1101 ....      @strex_0
STLEXD_t32       1110 1000 1100 .... .... .... 1111 ....      @strex_d

STL              1110 1000 1100 .... .... 1111 1010 1111      @ldrex_0
STLB             1110 1000 1100 .... .... 1111 1000 1111      @ldrex_0
STLH             1110 1000 1100 .... .... 1111 1001 1111      @ldrex_0

LDREX            1110 1000 0101 .... .... 1111 .... ....      @ldrex_i
LDREXB           1110 1000 1101 .... .... 1111 0100 1111      @ldrex_0
LDREXH           1110 1000 1101 .... .... 1111 0101 1111      @ldrex_0
LDREXD_t32       1110 1000 1101 .... .... .... 0111 1111      @ldrex_d

LDAEX            1110 1000 1101 .... .... 1111 1110 1111      @ldrex_0
LDAEXB           1110 1000 1101 .... .... 1111 1100 1111      @ldrex_0
LDAEXH           1110 1000 1101 .... .... 1111 1101 1111      @ldrex_0
LDAEXD_t32       1110 1000 1101 .... .... .... 1111 1111      @ldrex_d

LDA              1110 1000 1101 .... .... 1111 1010 1111      @ldrex_0
LDAB             1110 1000 1101 .... .... 1111 1000 1111      @ldrex_0
LDAH             1110 1000 1101 .... .... 1111 1001 1111      @ldrex_0

&tbranch         rn rm
@tbranch         .... .... .... rn:4 .... .... .... rm:4      &tbranch

TBB              1110 1000 1101 .... 1111 0000 0000 ....      @tbranch
TBH              1110 1000 1101 .... 1111 0000 0001 ....      @tbranch

# Parallel addition and subtraction

SADD8            1111 1010 1000 .... 1111 .... 0000 ....      @rndm
QADD8            1111 1010 1000 .... 1111 .... 0001 ....      @rndm
SHADD8           1111 1010 1000 .... 1111 .... 0010 ....      @rndm
UADD8            1111 1010 1000 .... 1111 .... 0100 ....      @rndm
UQADD8           1111 1010 1000 .... 1111 .... 0101 ....      @rndm
UHADD8           1111 1010 1000 .... 1111 .... 0110 ....      @rndm

SADD16           1111 1010 1001 .... 1111 .... 0000 ....      @rndm
QADD16           1111 1010 1001 .... 1111 .... 0001 ....      @rndm
SHADD16          1111 1010 1001 .... 1111 .... 0010 ....      @rndm
UADD16           1111 1010 1001 .... 1111 .... 0100 ....      @rndm
UQADD16          1111 1010 1001 .... 1111 .... 0101 ....      @rndm
UHADD16          1111 1010 1001 .... 1111 .... 0110 ....      @rndm

SASX             1111 1010 1010 .... 1111 .... 0000 ....      @rndm
QASX             1111 1010 1010 .... 1111 .... 0001 ....      @rndm
SHASX            1111 1010 1010 .... 1111 .... 0010 ....      @rndm
UASX             1111 1010 1010 .... 1111 .... 0100 ....      @rndm
UQASX            1111 1010 1010 .... 1111 .... 0101 ....      @rndm
UHASX            1111 1010 1010 .... 1111 .... 0110 ....      @rndm

SSUB8            1111 1010 1100 .... 1111 .... 0000 ....      @rndm
QSUB8            1111 1010 1100 .... 1111 .... 0001 ....      @rndm
SHSUB8           1111 1010 1100 .... 1111 .... 0010 ....      @rndm
USUB8            1111 1010 1100 .... 1111 .... 0100 ....      @rndm
UQSUB8           1111 1010 1100 .... 1111 .... 0101 ....      @rndm
UHSUB8           1111 1010 1100 .... 1111 .... 0110 ....      @rndm

SSUB16           1111 1010 1101 .... 1111 .... 0000 ....      @rndm
QSUB16           1111 1010 1101 .... 1111 .... 0001 ....      @rndm
SHSUB16          1111 1010 1101 .... 1111 .... 0010 ....      @rndm
USUB16           1111 1010 1101 .... 1111 .... 0100 ....      @rndm
UQSUB16          1111 1010 1101 .... 1111 .... 0101 ....      @rndm
UHSUB16          1111 1010 1101 .... 1111 .... 0110 ....      @rndm

SSAX             1111 1010 1110 .... 1111 .... 0000 ....      @rndm
QSAX             1111 1010 1110 .... 1111 .... 0001 ....      @rndm
SHSAX            1111 1010 1110 .... 1111 .... 0010 ....      @rndm
USAX             1111 1010 1110 .... 1111 .... 0100 ....      @rndm
UQSAX            1111 1010 1110 .... 1111 .... 0101 ....      @rndm
UHSAX            1111 1010 1110 .... 1111 .... 0110 ....      @rndm

# Register extends

@rrr_rot         .... .... .... rn:4 .... rd:4 .. rot:2 rm:4  &rrr_rot

SXTAH            1111 1010 0000 .... 1111 .... 10.. ....      @rrr_rot
UXTAH            1111 1010 0001 .... 1111 .... 10.. ....      @rrr_rot
SXTAB16          1111 1010 0010 .... 1111 .... 10.. ....      @rrr_rot
UXTAB16          1111 1010 0011 .... 1111 .... 10.. ....      @rrr_rot
SXTAB            1111 1010 0100 .... 1111 .... 10.. ....      @rrr_rot
UXTAB            1111 1010 0101 .... 1111 .... 10.. ....      @rrr_rot

# Load/store multiple

@ldstm           .... .... .. w:1 . rn:4 list:16              &ldst_block u=0

STM_t32          1110 1000 10.0 .... ................         @ldstm i=1 b=0
STM_t32          1110 1001 00.0 .... ................         @ldstm i=0 b=1
{
  # Rn=15 UNDEFs for LDM; M-profile CLRM uses that encoding
  CLRM           1110 1000 1001 1111 list:16
  LDM_t32        1110 1000 10.1 .... ................         @ldstm i=1 b=0
}
LDM_t32          1110 1001 00.1 .... ................         @ldstm i=0 b=1

&rfe             !extern rn w pu
@rfe             .... .... .. w:1 . rn:4 ................     &rfe

RFE              1110 1000 00.1 .... 1100000000000000         @rfe pu=2
RFE              1110 1001 10.1 .... 1100000000000000         @rfe pu=1

&srs             !extern mode w pu
@srs             .... .... .. w:1 . .... ........... mode:5   &srs

SRS              1110 1000 00.0 1101 1100 0000 000. ....      @srs pu=2
SRS              1110 1001 10.0 1101 1100 0000 000. ....      @srs pu=1

# Coprocessor instructions

# We decode MCR, MCR, MRRC and MCRR only, because for QEMU the
# other coprocessor instructions always UNDEF.
# The trans_ functions for these will ignore cp values 8..13 for v7 or
# earlier, and 0..13 for v8 and later, because those areas of the
# encoding space may be used for other things, such as VFP or Neon.

@mcr             .... .... opc1:3 . crn:4 rt:4 cp:4 opc2:3 . crm:4
@mcrr            .... .... .... rt2:4 rt:4 cp:4 opc1:4 crm:4

MCRR             1110 1100 0100 .... .... .... .... .... @mcrr
MRRC             1110 1100 0101 .... .... .... .... .... @mcrr

MCR              1110 1110 ... 0 .... .... .... ... 1 .... @mcr
MRC              1110 1110 ... 1 .... .... .... ... 1 .... @mcr

# Branches

%imm24           26:s1 13:1 11:1 16:10 0:11 !function=t32_branch24
@branch24        ................................             &i imm=%imm24

B                1111 0. .......... 10.1 ............         @branch24
BL               1111 0. .......... 11.1 ............         @branch24
{
  # BLX_i is non-M-profile only
  BLX_i          1111 0. .......... 11.0 ............         @branch24
  # M-profile only: loop and branch insns
  [
    # All these BF insns have boff != 0b0000; we NOP them all
    BF           1111 0 boff:4  ------- 1100 - ---------- 1    # BFL
    BF           1111 0 boff:4 0 ------ 1110 - ---------- 1    # BFCSEL
    BF           1111 0 boff:4 10 ----- 1110 - ---------- 1    # BF
    BF           1111 0 boff:4 11 ----- 1110 0 0000000000 1    # BFX, BFLX
  ]
  [
    # LE and WLS immediate
    %lob_imm 1:10 11:1 !function=times_2

    DLS          1111 0 0000 100     rn:4 1110 0000 0000 0001
    WLS          1111 0 0000 100     rn:4 1100 . .......... 1 imm=%lob_imm
    LE           1111 0 0000 0 f:1 0 1111 1100 . .......... 1 imm=%lob_imm
  ]
}