# SPDX-License-Identifier: LGPL-2.0+
#
# Sparc instruction decode definitions.
# Copyright (c) 2023 Richard Henderson <rth@twiddle.net>

##
## Major Opcodes 00 and 01 -- branches, call, and sethi.
##

&bcc    i a cond cc
BPcc    00 a:1 cond:4   001 cc:1 0 - i:s19                 &bcc
Bicc    00 a:1 cond:4   010          i:s22                 &bcc cc=0
FBPfcc  00 a:1 cond:4   101 cc:2   - i:s19                 &bcc
FBfcc   00 a:1 cond:4   110          i:s22                 &bcc cc=0

%d16    20:s2 0:14
BPr     00 a:1 0 cond:3 011 ..     - rs1:5 ..............  i=%d16

NCP     00 -   ----     111 ----------------------         # CBcc

SETHI   00 rd:5         100 i:22

CALL    01 i:s30

##
## Major Opcode 10 -- integer, floating-point, vis, and system insns.
##

%dfp_rd     25:5 !function=extract_dfpreg
%dfp_rs1    14:5 !function=extract_dfpreg
%dfp_rs2     0:5 !function=extract_dfpreg
%dfp_rs3     9:5 !function=extract_dfpreg

%qfp_rd     25:5 !function=extract_qfpreg
%qfp_rs1    14:5 !function=extract_qfpreg
%qfp_rs2     0:5 !function=extract_qfpreg

&r_r_ri     rd rs1 rs2_or_imm imm:bool
@n_r_ri     .. ..... ...... rs1:5 imm:1 rs2_or_imm:s13     &r_r_ri rd=0
@r_r_ri     .. rd:5  ...... rs1:5 imm:1 rs2_or_imm:s13     &r_r_ri

&r_r_ri_cc  rd rs1 rs2_or_imm imm:bool cc:bool
@r_r_ri_cc  .. rd:5  . cc:1 .... rs1:5 imm:1 rs2_or_imm:s13    &r_r_ri_cc
@r_r_ri_cc0 .. rd:5  ...... rs1:5 imm:1 rs2_or_imm:s13         &r_r_ri_cc cc=0
@r_r_ri_cc1 .. rd:5  ...... rs1:5 imm:1 rs2_or_imm:s13         &r_r_ri_cc cc=1

&r_r_r      rd rs1 rs2
@r_r_r      .. rd:5  ...... rs1:5 . ........ rs2:5         &r_r_r
@d_r_r      .. ..... ...... rs1:5 . ........ rs2:5         \
            &r_r_r rd=%dfp_rd
@r_d_d      .. rd:5  ...... ..... . ........ .....         \
            &r_r_r rs1=%dfp_rs1 rs2=%dfp_rs2
@d_r_d      .. ..... ...... rs1:5 . ........ .....         \
            &r_r_r rd=%dfp_rd rs2=%dfp_rs2
@d_d_d      .. ..... ...... ..... . ........ .....         \
            &r_r_r rd=%dfp_rd rs1=%dfp_rs1 rs2=%dfp_rs2
@q_q_q      .. ..... ...... ..... . ........ .....         \
            &r_r_r rd=%qfp_rd rs1=%qfp_rs1 rs2=%qfp_rs2
@q_d_d      .. ..... ...... ..... . ........ .....         \
            &r_r_r rd=%qfp_rd rs1=%dfp_rs1 rs2=%dfp_rs2

@r_r_r_swap .. rd:5  ...... rs2:5 . ........ rs1:5         &r_r_r
@d_d_d_swap .. ..... ...... ..... . ........ .....         \
            &r_r_r rd=%dfp_rd rs1=%dfp_rs2 rs2=%dfp_rs1

&r_r        rd rs
@r_r1       .. rd:5  ...... rs:5  . ........ .....         &r_r
@r_r2       .. rd:5  ...... ..... . ........ rs:5          &r_r
@r_d2       .. rd:5  ...... ..... . ........ .....         &r_r rs=%dfp_rs2
@r_q2       .. rd:5  ...... ..... . ........ .....         &r_r rs=%qfp_rs2
@d_r2       .. ..... ...... ..... . ........ rs:5          &r_r rd=%dfp_rd
@q_r2       .. ..... ...... ..... . ........ rs:5          &r_r rd=%qfp_rd
@d_d1       .. ..... ...... ..... . ........ .....         \
            &r_r rd=%dfp_rd rs=%dfp_rs1
@d_d2       .. ..... ...... ..... . ........ .....         \
            &r_r rd=%dfp_rd rs=%dfp_rs2
@d_q2       .. ..... ...... ..... . ........ .....         \
            &r_r rd=%dfp_rd rs=%qfp_rs2
@q_q2       .. ..... ...... ..... . ........ .....         \
            &r_r rd=%qfp_rd rs=%qfp_rs2
@q_d2       .. ..... ...... ..... . ........ .....         \
            &r_r rd=%qfp_rd rs=%dfp_rs2

&r_r_r_r    rd rs1 rs2 rs3
@r_r_r_r    .. rd:5  ...... rs1:5 rs3:5 .... rs2:5         &r_r_r_r
@d_d_d_d    .. ..... ...... ..... ..... .... .....         \
            &r_r_r_r rd=%dfp_rd rs1=%dfp_rs1 rs2=%dfp_rs2 rs3=%dfp_rs3

{
  [
    STBAR           10 00000 101000 01111 0 0000000000000
    MEMBAR          10 00000 101000 01111 1 000000 cmask:3 mmask:4

    RDCCR           10 rd:5  101000 00010 0 0000000000000
    RDASI           10 rd:5  101000 00011 0 0000000000000
    RDTICK          10 rd:5  101000 00100 0 0000000000000
    RDPC            10 rd:5  101000 00101 0 0000000000000
    RDFPRS          10 rd:5  101000 00110 0 0000000000000
    RDASR17         10 rd:5  101000 10001 0 0000000000000
    RDGSR           10 rd:5  101000 10011 0 0000000000000
    RDSOFTINT       10 rd:5  101000 10110 0 0000000000000
    RDTICK_CMPR     10 rd:5  101000 10111 0 0000000000000
    RDSTICK         10 rd:5  101000 11000 0 0000000000000
    RDSTICK_CMPR    10 rd:5  101000 11001 0 0000000000000
    RDSTRAND_STATUS 10 rd:5  101000 11010 0 0000000000000
  ]
  # Before v8, all rs1 accepted; otherwise rs1==0.
  RDY               10 rd:5  101000 rs1:5 0 0000000000000
}

{
  [
    WRY             10 00000 110000 ..... . .............  @n_r_ri
    WRCCR           10 00010 110000 ..... . .............  @n_r_ri
    WRASI           10 00011 110000 ..... . .............  @n_r_ri
    WRFPRS          10 00110 110000 ..... . .............  @n_r_ri
    {
      WRGSR         10 10011 110000 ..... . .............  @n_r_ri
      WRPOWERDOWN   10 10011 110000 ..... . .............  @n_r_ri
    }
    WRSOFTINT_SET   10 10100 110000 ..... . .............  @n_r_ri
    WRSOFTINT_CLR   10 10101 110000 ..... . .............  @n_r_ri
    WRSOFTINT       10 10110 110000 ..... . .............  @n_r_ri
    WRTICK_CMPR     10 10111 110000 ..... . .............  @n_r_ri
    WRSTICK         10 11000 110000 ..... . .............  @n_r_ri
    WRSTICK_CMPR    10 11001 110000 ..... . .............  @n_r_ri
    WRMWAIT         10 11100 110000 ..... . .............  @n_r_ri
  ]
  # Before v8, rs1==0 was WRY, and the rest executed as nop.
  [
    NOP_v7          10 ----- 110000 ----- 0 00000000 -----
    NOP_v7          10 ----- 110000 ----- 1 -------- -----
  ]
}

{
  RDPSR             10 rd:5  101001 00000 0 0000000000000
  RDHPR_hpstate     10 rd:5  101001 00000 0 0000000000000
}
RDHPR_htstate       10 rd:5  101001 00001 0 0000000000000
RDHPR_hintp         10 rd:5  101001 00011 0 0000000000000
RDHPR_htba          10 rd:5  101001 00101 0 0000000000000
RDHPR_hver          10 rd:5  101001 00110 0 0000000000000
RDHPR_hstick_cmpr   10 rd:5  101001 11111 0 0000000000000

{
  WRPSR             10 00000 110001 ..... . .............  @n_r_ri
  SAVED             10 00000 110001 00000 0 0000000000000
}
RESTORED            10 00001 110001 00000 0 0000000000000
# UA2005 ALLCLEAN
# UA2005 OTHERW
# UA2005 NORMALW
# UA2005 INVALW

{
  RDWIM             10 rd:5  101010 00000 0 0000000000000
  RDPR_tpc          10 rd:5  101010 00000 0 0000000000000
}
RDPR_tnpc           10 rd:5  101010 00001 0 0000000000000
RDPR_tstate         10 rd:5  101010 00010 0 0000000000000
RDPR_tt             10 rd:5  101010 00011 0 0000000000000
RDPR_tick           10 rd:5  101010 00100 0 0000000000000
RDPR_tba            10 rd:5  101010 00101 0 0000000000000
RDPR_pstate         10 rd:5  101010 00110 0 0000000000000
RDPR_tl             10 rd:5  101010 00111 0 0000000000000
RDPR_pil            10 rd:5  101010 01000 0 0000000000000
RDPR_cwp            10 rd:5  101010 01001 0 0000000000000
RDPR_cansave        10 rd:5  101010 01010 0 0000000000000
RDPR_canrestore     10 rd:5  101010 01011 0 0000000000000
RDPR_cleanwin       10 rd:5  101010 01100 0 0000000000000
RDPR_otherwin       10 rd:5  101010 01101 0 0000000000000
RDPR_wstate         10 rd:5  101010 01110 0 0000000000000
RDPR_gl             10 rd:5  101010 10000 0 0000000000000
RDPR_strand_status  10 rd:5  101010 11010 0 0000000000000
RDPR_ver            10 rd:5  101010 11111 0 0000000000000

{
  WRWIM             10 00000 110010 ..... . .............  @n_r_ri
  WRPR_tpc          10 00000 110010 ..... . .............  @n_r_ri
}
WRPR_tnpc           10 00001 110010 ..... . .............  @n_r_ri
WRPR_tstate         10 00010 110010 ..... . .............  @n_r_ri
WRPR_tt             10 00011 110010 ..... . .............  @n_r_ri
WRPR_tick           10 00100 110010 ..... . .............  @n_r_ri
WRPR_tba            10 00101 110010 ..... . .............  @n_r_ri
WRPR_pstate         10 00110 110010 ..... . .............  @n_r_ri
WRPR_tl             10 00111 110010 ..... . .............  @n_r_ri
WRPR_pil            10 01000 110010 ..... . .............  @n_r_ri
WRPR_cwp            10 01001 110010 ..... . .............  @n_r_ri
WRPR_cansave        10 01010 110010 ..... . .............  @n_r_ri
WRPR_canrestore     10 01011 110010 ..... . .............  @n_r_ri
WRPR_cleanwin       10 01100 110010 ..... . .............  @n_r_ri
WRPR_otherwin       10 01101 110010 ..... . .............  @n_r_ri
WRPR_wstate         10 01110 110010 ..... . .............  @n_r_ri
WRPR_gl             10 10000 110010 ..... . .............  @n_r_ri
WRPR_strand_status  10 11010 110010 ..... . .............  @n_r_ri

{
  FLUSHW    10 00000 101011 00000 0 0000000000000
  RDTBR     10 rd:5  101011 00000 0 0000000000000
}

{
  WRTBR             10 00000 110011 ..... . .............  @n_r_ri
  WRHPR_hpstate     10 00000 110011 ..... . .............  @n_r_ri
}
WRHPR_htstate       10 00001 110011 ..... . .............  @n_r_ri
WRHPR_hintp         10 00011 110011 ..... . .............  @n_r_ri
WRHPR_htba          10 00101 110011 ..... . .............  @n_r_ri
WRHPR_hstick_cmpr   10 11111 110011 ..... . .............  @n_r_ri

ADD         10 ..... 0.0000 ..... . .............          @r_r_ri_cc
AND         10 ..... 0.0001 ..... . .............          @r_r_ri_cc
OR          10 ..... 0.0010 ..... . .............          @r_r_ri_cc
XOR         10 ..... 0.0011 ..... . .............          @r_r_ri_cc
SUB         10 ..... 0.0100 ..... . .............          @r_r_ri_cc
ANDN        10 ..... 0.0101 ..... . .............          @r_r_ri_cc
ORN         10 ..... 0.0110 ..... . .............          @r_r_ri_cc
XORN        10 ..... 0.0111 ..... . .............          @r_r_ri_cc
ADDC        10 ..... 0.1000 ..... . .............          @r_r_ri_cc
SUBC        10 ..... 0.1100 ..... . .............          @r_r_ri_cc

MULX        10 ..... 001001 ..... . .............          @r_r_ri_cc0
UMUL        10 ..... 0.1010 ..... . .............          @r_r_ri_cc
SMUL        10 ..... 0.1011 ..... . .............          @r_r_ri_cc
MULScc      10 ..... 100100 ..... . .............          @r_r_ri_cc1

UDIVX       10 ..... 001101 ..... . .............          @r_r_ri
SDIVX       10 ..... 101101 ..... . .............          @r_r_ri
UDIV        10 ..... 001110 ..... . .............          @r_r_ri
UDIVcc      10 ..... 011110 ..... . .............          @r_r_ri_cc1
SDIV        10 ..... 0.1111 ..... . .............          @r_r_ri_cc

TADDcc      10 ..... 100000 ..... . .............          @r_r_ri_cc1
TSUBcc      10 ..... 100001 ..... . .............          @r_r_ri_cc1
TADDccTV    10 ..... 100010 ..... . .............          @r_r_ri_cc1
TSUBccTV    10 ..... 100011 ..... . .............          @r_r_ri_cc1

POPC        10 rd:5  101110 00000 imm:1 rs2_or_imm:s13     \
            &r_r_ri_cc rs1=0 cc=0

&shiftr     rd rs1 rs2 x:bool
@shiftr     .. rd:5  ...... rs1:5 . x:1 ....... rs2:5      &shiftr

SLL_r       10 ..... 100101 ..... 0 .   0000000 .....      @shiftr
SRL_r       10 ..... 100110 ..... 0 .   0000000 .....      @shiftr
SRA_r       10 ..... 100111 ..... 0 .   0000000 .....      @shiftr

&shifti     rd rs1 i x:bool
@shifti     .. rd:5  ...... rs1:5 . x:1 ...... i:6         &shifti

SLL_i       10 ..... 100101 ..... 1 .   000000 ......      @shifti
SRL_i       10 ..... 100110 ..... 1 .   000000 ......      @shifti
SRA_i       10 ..... 100111 ..... 1 .   000000 ......      @shifti

Tcc_r       10 0 cond:4 111010 rs1:5 0 cc:1 0000000 rs2:5
{
  # For v7, the entire simm13 field is present, but masked to 7 bits.
  # For v8, [12:7] are reserved.  However, a compatibility note for
  # the Tcc insn in the v9 manual suggests that the v8 reserved field
  # was ignored and did not produce traps.
  Tcc_i_v7  10 0 cond:4 111010 rs1:5 1 ------ i:7

  # For v9, bits [12:11] are cc1 and cc0 (and cc0 must be 0).
  # Bits [10:8] are reserved and the OSA2011 manual says they must be 0.
  Tcc_i_v9  10 0 cond:4 111010 rs1:5 1 cc:1 0 000 i:8
}

MOVcc       10 rd:5  101100 1 cond:4 imm:1 cc:1 0 rs2_or_imm:s11
MOVfcc      10 rd:5  101100 0 cond:4 imm:1 cc:2   rs2_or_imm:s11
MOVR        10 rd:5  101111 rs1:5    imm:1 cond:3 rs2_or_imm:s10

JMPL        10 ..... 111000 ..... . .............          @r_r_ri
{
  RETT      10 00000 111001 ..... . .............          @n_r_ri
  RETURN    10 00000 111001 ..... . .............          @n_r_ri
}
NOP         10 00000 111011 ----- 0 00000000-----          # FLUSH reg+reg
NOP         10 00000 111011 ----- 1 -------------          # FLUSH reg+imm
SAVE        10 ..... 111100 ..... . .............          @r_r_ri
RESTORE     10 ..... 111101 ..... . .............          @r_r_ri

DONE        10 00000 111110 00000 0 0000000000000
RETRY       10 00001 111110 00000 0 0000000000000

FMOVs       10 ..... 110100 00000 0 0000 0001 .....        @r_r2
FMOVd       10 ..... 110100 00000 0 0000 0010 .....        @d_d2
FMOVq       10 ..... 110100 00000 0 0000 0011 .....        @q_q2
FNEGs       10 ..... 110100 00000 0 0000 0101 .....        @r_r2
FNEGd       10 ..... 110100 00000 0 0000 0110 .....        @d_d2
FNEGq       10 ..... 110100 00000 0 0000 0111 .....        @q_q2
FABSs       10 ..... 110100 00000 0 0000 1001 .....        @r_r2
FABSd       10 ..... 110100 00000 0 0000 1010 .....        @d_d2
FABSq       10 ..... 110100 00000 0 0000 1011 .....        @q_q2
FSQRTs      10 ..... 110100 00000 0 0010 1001 .....        @r_r2
FSQRTd      10 ..... 110100 00000 0 0010 1010 .....        @d_d2
FSQRTq      10 ..... 110100 00000 0 0010 1011 .....        @q_q2
FADDs       10 ..... 110100 ..... 0 0100 0001 .....        @r_r_r
FADDd       10 ..... 110100 ..... 0 0100 0010 .....        @d_d_d
FADDq       10 ..... 110100 ..... 0 0100 0011 .....        @q_q_q
FSUBs       10 ..... 110100 ..... 0 0100 0101 .....        @r_r_r
FSUBd       10 ..... 110100 ..... 0 0100 0110 .....        @d_d_d
FSUBq       10 ..... 110100 ..... 0 0100 0111 .....        @q_q_q
FMULs       10 ..... 110100 ..... 0 0100 1001 .....        @r_r_r
FMULd       10 ..... 110100 ..... 0 0100 1010 .....        @d_d_d
FMULq       10 ..... 110100 ..... 0 0100 1011 .....        @q_q_q
FDIVs       10 ..... 110100 ..... 0 0100 1101 .....        @r_r_r
FDIVd       10 ..... 110100 ..... 0 0100 1110 .....        @d_d_d
FDIVq       10 ..... 110100 ..... 0 0100 1111 .....        @q_q_q
FNADDs      10 ..... 110100 ..... 0 0101 0001 .....        @r_r_r
FNADDd      10 ..... 110100 ..... 0 0101 0010 .....        @d_d_d
FNMULs      10 ..... 110100 ..... 0 0101 1001 .....        @r_r_r
FNMULd      10 ..... 110100 ..... 0 0101 1010 .....        @d_d_d
FHADDs      10 ..... 110100 ..... 0 0110 0001 .....        @r_r_r
FHADDd      10 ..... 110100 ..... 0 0110 0010 .....        @d_d_d
FHSUBs      10 ..... 110100 ..... 0 0110 0101 .....        @r_r_r
FHSUBd      10 ..... 110100 ..... 0 0110 0110 .....        @d_d_d
FsMULd      10 ..... 110100 ..... 0 0110 1001 .....        @d_r_r
FdMULq      10 ..... 110100 ..... 0 0110 1110 .....        @q_d_d
FNHADDs     10 ..... 110100 ..... 0 0111 0001 .....        @r_r_r
FNHADDd     10 ..... 110100 ..... 0 0111 0010 .....        @d_d_d
FNsMULd     10 ..... 110100 ..... 0 0111 1001 .....        @d_r_r
FsTOx       10 ..... 110100 00000 0 1000 0001 .....        @r_r2
FdTOx       10 ..... 110100 00000 0 1000 0010 .....        @r_d2
FqTOx       10 ..... 110100 00000 0 1000 0011 .....        @r_q2
FxTOs       10 ..... 110100 00000 0 1000 0100 .....        @r_r2
FxTOd       10 ..... 110100 00000 0 1000 1000 .....        @d_r2
FxTOq       10 ..... 110100 00000 0 1000 1100 .....        @q_r2
FiTOs       10 ..... 110100 00000 0 1100 0100 .....        @r_r2
FdTOs       10 ..... 110100 00000 0 1100 0110 .....        @r_d2
FqTOs       10 ..... 110100 00000 0 1100 0111 .....        @r_q2
FiTOd       10 ..... 110100 00000 0 1100 1000 .....        @d_r2
FsTOd       10 ..... 110100 00000 0 1100 1001 .....        @d_r2
FqTOd       10 ..... 110100 00000 0 1100 1011 .....        @d_q2
FiTOq       10 ..... 110100 00000 0 1100 1100 .....        @q_r2
FsTOq       10 ..... 110100 00000 0 1100 1101 .....        @q_r2
FdTOq       10 ..... 110100 00000 0 1100 1110 .....        @q_d2
FsTOi       10 ..... 110100 00000 0 1101 0001 .....        @r_r2
FdTOi       10 ..... 110100 00000 0 1101 0010 .....        @r_d2
FqTOi       10 ..... 110100 00000 0 1101 0011 .....        @r_q2

FMOVscc     10 rd:5  110101 0 cond:4 1 cc:1 0 000001 rs2:5
FMOVdcc     10 ..... 110101 0 cond:4 1 cc:1 0 000010 ..... \
            rd=%dfp_rd rs2=%dfp_rs2
FMOVqcc     10 ..... 110101 0 cond:4 1 cc:1 0 000011 ..... \
            rd=%qfp_rd rs2=%qfp_rs2

FMOVsfcc    10 rd:5  110101 0 cond:4 0 cc:2   000001 rs2:5
FMOVdfcc    10 ..... 110101 0 cond:4 0 cc:2   000010 ..... \
            rd=%dfp_rd rs2=%dfp_rs2
FMOVqfcc    10 ..... 110101 0 cond:4 0 cc:2   000011 ..... \
            rd=%qfp_rd rs2=%qfp_rs2

FMOVRs      10 rd:5  110101 rs1:5    0 cond:3  00101 rs2:5
FMOVRd      10 ..... 110101 rs1:5    0 cond:3  00110 ..... \
            rd=%dfp_rd rs2=%dfp_rs2
FMOVRq      10 ..... 110101 rs1:5    0 cond:3  00111 ..... \
            rd=%qfp_rd rs2=%qfp_rs2

FCMPs       10 000 cc:2 110101 rs1:5  0 0101 0001 rs2:5
FCMPd       10 000 cc:2 110101 .....  0 0101 0010 .....    \
            rs1=%dfp_rs1 rs2=%dfp_rs2
FCMPq       10 000 cc:2 110101 .....  0 0101 0011 .....    \
            rs1=%qfp_rs1 rs2=%qfp_rs2
FCMPEs      10 000 cc:2 110101 rs1:5  0 0101 0101 rs2:5
FCMPEd      10 000 cc:2 110101 .....  0 0101 0110 .....    \
            rs1=%dfp_rs1 rs2=%dfp_rs2
FCMPEq      10 000 cc:2 110101 .....  0 0101 0111 .....    \
            rs1=%qfp_rs1 rs2=%qfp_rs2

{
  [
    EDGE8cc     10 ..... 110110 ..... 0 0000 0000 .....    @r_r_r
    EDGE8N      10 ..... 110110 ..... 0 0000 0001 .....    @r_r_r
    EDGE8Lcc    10 ..... 110110 ..... 0 0000 0010 .....    @r_r_r
    EDGE8LN     10 ..... 110110 ..... 0 0000 0011 .....    @r_r_r
    EDGE16cc    10 ..... 110110 ..... 0 0000 0100 .....    @r_r_r
    EDGE16N     10 ..... 110110 ..... 0 0000 0101 .....    @r_r_r
    EDGE16Lcc   10 ..... 110110 ..... 0 0000 0110 .....    @r_r_r
    EDGE16LN    10 ..... 110110 ..... 0 0000 0111 .....    @r_r_r
    EDGE32cc    10 ..... 110110 ..... 0 0000 1000 .....    @r_r_r
    EDGE32N     10 ..... 110110 ..... 0 0000 1001 .....    @r_r_r
    EDGE32Lcc   10 ..... 110110 ..... 0 0000 1010 .....    @r_r_r
    EDGE32LN    10 ..... 110110 ..... 0 0000 1011 .....    @r_r_r

    ARRAY8      10 ..... 110110 ..... 0 0001 0000 .....    @r_r_r
    ARRAY16     10 ..... 110110 ..... 0 0001 0010 .....    @r_r_r
    ARRAY32     10 ..... 110110 ..... 0 0001 0100 .....    @r_r_r

    ADDXC       10 ..... 110110 ..... 0 0001 0001 .....    @r_r_r
    ADDXCcc     10 ..... 110110 ..... 0 0001 0011 .....    @r_r_r
    UMULXHI     10 ..... 110110 ..... 0 0001 0110 .....    @r_r_r
    LZCNT       10 ..... 110110 00000 0 0001 0111 .....    @r_r2
    XMULX       10 ..... 110110 ..... 1 0001 0101 .....    @r_r_r
    XMULXHI     10 ..... 110110 ..... 1 0001 0110 .....    @r_r_r

    ALIGNADDR   10 ..... 110110 ..... 0 0001 1000 .....    @r_r_r
    ALIGNADDRL  10 ..... 110110 ..... 0 0001 1010 .....    @r_r_r

    BMASK       10 ..... 110110 ..... 0 0001 1001 .....    @r_r_r

    CMASK8      10 00000 110110 00000 0 0001 1011 rs2:5
    CMASK16     10 00000 110110 00000 0 0001 1101 rs2:5
    CMASK32     10 00000 110110 00000 0 0001 1111 rs2:5

    FPCMPLE16   10 ..... 110110 ..... 0 0010 0000 .....    @r_d_d
    FPCMPNE16   10 ..... 110110 ..... 0 0010 0010 .....    @r_d_d
    FPCMPGT16   10 ..... 110110 ..... 0 0010 1000 .....    @r_d_d
    FPCMPEQ16   10 ..... 110110 ..... 0 0010 1010 .....    @r_d_d
    FPCMPLE32   10 ..... 110110 ..... 0 0010 0100 .....    @r_d_d
    FPCMPNE32   10 ..... 110110 ..... 0 0010 0110 .....    @r_d_d
    FPCMPGT32   10 ..... 110110 ..... 0 0010 1100 .....    @r_d_d
    FPCMPEQ32   10 ..... 110110 ..... 0 0010 1110 .....    @r_d_d

    FSLL16      10 ..... 110110 ..... 0 0010 0001 .....    @d_d_d
    FSRL16      10 ..... 110110 ..... 0 0010 0011 .....    @d_d_d
    FSLAS16     10 ..... 110110 ..... 0 0010 1001 .....    @d_d_d
    FSRA16      10 ..... 110110 ..... 0 0010 1011 .....    @d_d_d
    FSLL32      10 ..... 110110 ..... 0 0010 0101 .....    @d_d_d
    FSRL32      10 ..... 110110 ..... 0 0010 0111 .....    @d_d_d
    FSLAS32     10 ..... 110110 ..... 0 0010 1101 .....    @d_d_d
    FSRA32      10 ..... 110110 ..... 0 0010 1111 .....    @d_d_d

    FPCMPULE8   10 ..... 110110 ..... 1 0010 0000 .....    @r_d_d
    FPCMPUGT8   10 ..... 110110 ..... 1 0010 1000 .....    @r_d_d
    FPCMPNE8    10 ..... 110110 ..... 1 0010 0010 .....    @r_d_d
    FPCMPEQ8    10 ..... 110110 ..... 1 0010 1010 .....    @r_d_d
    FPCMPLE8    10 ..... 110110 ..... 0 0011 0100 .....    @r_d_d
    FPCMPGT8    10 ..... 110110 ..... 0 0011 1100 .....    @r_d_d
    FPCMPULE16  10 ..... 110110 ..... 1 0010 1110 .....    @r_d_d
    FPCMPUGT16  10 ..... 110110 ..... 1 0010 1011 .....    @r_d_d
    FPCMPULE32  10 ..... 110110 ..... 1 0010 1111 .....    @r_d_d
    FPCMPUGT32  10 ..... 110110 ..... 1 0010 1100 .....    @r_d_d

    FMUL8x16    10 ..... 110110 ..... 0 0011 0001 .....    @d_r_d
    FMUL8x16AU  10 ..... 110110 ..... 0 0011 0011 .....    @d_r_r
    FMUL8x16AL  10 ..... 110110 ..... 0 0011 0101 .....    @d_r_r
    FMUL8SUx16  10 ..... 110110 ..... 0 0011 0110 .....    @d_d_d
    FMUL8ULx16  10 ..... 110110 ..... 0 0011 0111 .....    @d_d_d
    FMULD8SUx16 10 ..... 110110 ..... 0 0011 1000 .....    @d_r_r
    FMULD8ULx16 10 ..... 110110 ..... 0 0011 1001 .....    @d_r_r
    FPACK32     10 ..... 110110 ..... 0 0011 1010 .....    @d_d_d
    FPACK16     10 ..... 110110 00000 0 0011 1011 .....    @r_d2
    FPACKFIX    10 ..... 110110 00000 0 0011 1101 .....    @r_d2
    PDIST       10 ..... 110110 ..... 0 0011 1110 .....    \
                &r_r_r_r rd=%dfp_rd rs1=%dfp_rd rs2=%dfp_rs1 rs3=%dfp_rs2
    PDISTN      10 ..... 110110 ..... 0 0011 1111 .....    @r_d_d

    FMEAN16     10 ..... 110110 ..... 0 0100 0000 .....    @d_d_d
    SUBXC       10 ..... 110110 ..... 0 0100 0001 .....    @r_r_r
    SUBXCcc     10 ..... 110110 ..... 0 0100 0011 .....    @r_r_r
    FCHKSM16    10 ..... 110110 ..... 0 0100 0100 .....    @d_d_d
    FALIGNDATAg 10 ..... 110110 ..... 0 0100 1000 .....    @d_d_d
    FPMERGE     10 ..... 110110 ..... 0 0100 1011 .....    @d_r_r
    BSHUFFLE    10 ..... 110110 ..... 0 0100 1100 .....    @d_d_d
    FEXPAND     10 ..... 110110 00000 0 0100 1101 .....    @d_r2
    FALIGNDATAi 10 ..... 110110 ..... 0 0100 1001 .....    @d_r_d

    FSRCd       10 ..... 110110 ..... 0 0111 0100 00000    @d_d1  # FSRC1d
    FSRCs       10 ..... 110110 ..... 0 0111 0101 00000    @r_r1  # FSRC1s
    FSRCd       10 ..... 110110 00000 0 0111 1000 .....    @d_d2  # FSRC2d
    FSRCs       10 ..... 110110 00000 0 0111 1001 .....    @r_r2  # FSRC2s
    FNOTd       10 ..... 110110 ..... 0 0110 1010 00000    @d_d1  # FNOT1d
    FNOTs       10 ..... 110110 ..... 0 0110 1011 00000    @r_r1  # FNOT1s
    FNOTd       10 ..... 110110 00000 0 0110 0110 .....    @d_d2  # FNOT2d
    FNOTs       10 ..... 110110 00000 0 0110 0111 .....    @r_r2  # FNOT2s

    FPADD16     10 ..... 110110 ..... 0 0101 0000 .....    @d_d_d
    FPADD16s    10 ..... 110110 ..... 0 0101 0001 .....    @r_r_r
    FPADD32     10 ..... 110110 ..... 0 0101 0010 .....    @d_d_d
    FPADD32s    10 ..... 110110 ..... 0 0101 0011 .....    @r_r_r
    FPADD64     10 ..... 110110 ..... 0 0100 0010 .....    @d_d_d
    FPSUB16     10 ..... 110110 ..... 0 0101 0100 .....    @d_d_d
    FPSUB16s    10 ..... 110110 ..... 0 0101 0101 .....    @r_r_r
    FPSUB32     10 ..... 110110 ..... 0 0101 0110 .....    @d_d_d
    FPSUB32s    10 ..... 110110 ..... 0 0101 0111 .....    @r_r_r
    FPSUB64     10 ..... 110110 ..... 0 0100 0110 .....    @d_d_d

    FPADDS16    10 ..... 110110 ..... 0 0101 1000 .....    @d_d_d
    FPADDS16s   10 ..... 110110 ..... 0 0101 1001 .....    @r_r_r
    FPADDS32    10 ..... 110110 ..... 0 0101 1010 .....    @d_d_d
    FPADDS32s   10 ..... 110110 ..... 0 0101 1011 .....    @r_r_r
    FPSUBS16    10 ..... 110110 ..... 0 0101 1100 .....    @d_d_d
    FPSUBS16s   10 ..... 110110 ..... 0 0101 1101 .....    @r_r_r
    FPSUBS32    10 ..... 110110 ..... 0 0101 1110 .....    @d_d_d
    FPSUBS32s   10 ..... 110110 ..... 0 0101 1111 .....    @r_r_r

    FNORd       10 ..... 110110 ..... 0 0110 0010 .....    @d_d_d
    FNORs       10 ..... 110110 ..... 0 0110 0011 .....    @r_r_r
    FANDNOTd    10 ..... 110110 ..... 0 0110 0100 .....    @d_d_d   # FANDNOT2d
    FANDNOTs    10 ..... 110110 ..... 0 0110 0101 .....    @r_r_r   # FANDNOT2s
    FANDNOTd    10 ..... 110110 ..... 0 0110 1000 .....    @d_d_d_swap # ... 1d
    FANDNOTs    10 ..... 110110 ..... 0 0110 1001 .....    @r_r_r_swap # ... 1s
    FXORd       10 ..... 110110 ..... 0 0110 1100 .....    @d_d_d
    FXORs       10 ..... 110110 ..... 0 0110 1101 .....    @r_r_r
    FNANDd      10 ..... 110110 ..... 0 0110 1110 .....    @d_d_d
    FNANDs      10 ..... 110110 ..... 0 0110 1111 .....    @r_r_r
    FANDd       10 ..... 110110 ..... 0 0111 0000 .....    @d_d_d
    FANDs       10 ..... 110110 ..... 0 0111 0001 .....    @r_r_r
    FXNORd      10 ..... 110110 ..... 0 0111 0010 .....    @d_d_d
    FXNORs      10 ..... 110110 ..... 0 0111 0011 .....    @r_r_r
    FORNOTd     10 ..... 110110 ..... 0 0111 0110 .....    @d_d_d    # FORNOT2d
    FORNOTs     10 ..... 110110 ..... 0 0111 0111 .....    @r_r_r    # FORNOT2s
    FORNOTd     10 ..... 110110 ..... 0 0111 1010 .....    @d_d_d_swap # ... 1d
    FORNOTs     10 ..... 110110 ..... 0 0111 1011 .....    @r_r_r_swap # ... 1s
    FORd        10 ..... 110110 ..... 0 0111 1100 .....    @d_d_d
    FORs        10 ..... 110110 ..... 0 0111 1101 .....    @r_r_r

    FZEROd      10 ..... 110110 00000 0 0110 0000 00000    rd=%dfp_rd
    FZEROs      10 rd:5  110110 00000 0 0110 0001 00000
    FONEd       10 ..... 110110 00000 0 0111 1110 00000    rd=%dfp_rd
    FONEs       10 rd:5  110110 00000 0 0111 1111 00000

    MOVsTOuw    10 ..... 110110 00000 1 0001 0001 .....    @r_r2
    MOVsTOsw    10 ..... 110110 00000 1 0001 0011 .....    @r_r2
    MOVwTOs     10 ..... 110110 00000 1 0001 1001 .....    @r_r2
    MOVdTOx     10 ..... 110110 00000 1 0001 0000 .....    @r_d2
    MOVxTOd     10 ..... 110110 00000 1 0001 1000 .....    @d_r2

    FPADD8      10 ..... 110110 ..... 1 0010 0100 .....    @d_d_d
    FPADDS8     10 ..... 110110 ..... 1 0010 0110 .....    @d_d_d
    FPADDUS8    10 ..... 110110 ..... 1 0010 0111 .....    @d_d_d
    FPADDUS16   10 ..... 110110 ..... 1 0010 0011 .....    @d_d_d
    FPSUB8      10 ..... 110110 ..... 1 0101 0100 .....    @d_d_d
    FPSUBS8     10 ..... 110110 ..... 1 0101 0110 .....    @d_d_d
    FPSUBUS8    10 ..... 110110 ..... 1 0101 0111 .....    @d_d_d
    FPSUBUS16   10 ..... 110110 ..... 1 0101 0011 .....    @d_d_d

    FPMIN8      10 ..... 110110 ..... 1 0001 1010 .....    @d_d_d
    FPMIN16     10 ..... 110110 ..... 1 0001 1011 .....    @d_d_d
    FPMIN32     10 ..... 110110 ..... 1 0001 1100 .....    @d_d_d
    FPMINU8     10 ..... 110110 ..... 1 0101 1010 .....    @d_d_d
    FPMINU16    10 ..... 110110 ..... 1 0101 1011 .....    @d_d_d
    FPMINU32    10 ..... 110110 ..... 1 0101 1100 .....    @d_d_d

    FPMAX8      10 ..... 110110 ..... 1 0001 1101 .....    @d_d_d
    FPMAX16     10 ..... 110110 ..... 1 0001 1110 .....    @d_d_d
    FPMAX32     10 ..... 110110 ..... 1 0001 1111 .....    @d_d_d
    FPMAXU8     10 ..... 110110 ..... 1 0101 1101 .....    @d_d_d
    FPMAXU16    10 ..... 110110 ..... 1 0101 1110 .....    @d_d_d
    FPMAXU32    10 ..... 110110 ..... 1 0101 1111 .....    @d_d_d

    FLCMPs      10 000 cc:2 110110 rs1:5 1 0101 0001 rs2:5
    FLCMPd      10 000 cc:2 110110 ..... 1 0101 0010 ..... \
                rs1=%dfp_rs1 rs2=%dfp_rs2
  ]
  NCP           10 ----- 110110 ----- --------- -----      # v8 CPop1
}

{
  [
    FMADDs      10 ..... 110111 ..... ..... 0001 .....     @r_r_r_r
    FMADDd      10 ..... 110111 ..... ..... 0010 .....     @d_d_d_d
    FMSUBs      10 ..... 110111 ..... ..... 0101 .....     @r_r_r_r
    FMSUBd      10 ..... 110111 ..... ..... 0110 .....     @d_d_d_d
    FNMSUBs     10 ..... 110111 ..... ..... 1001 .....     @r_r_r_r
    FNMSUBd     10 ..... 110111 ..... ..... 1010 .....     @d_d_d_d
    FNMADDs     10 ..... 110111 ..... ..... 1101 .....     @r_r_r_r
    FNMADDd     10 ..... 110111 ..... ..... 1110 .....     @d_d_d_d

    FPMADDX     10 ..... 110111 ..... ..... 0000 .....     @d_d_d_d
    FPMADDXHI   10 ..... 110111 ..... ..... 0100 .....     @d_d_d_d
  ]
  NCP           10 ----- 110111 ----- --------- -----      # v8 CPop2
}

##
## Major Opcode 11 -- load and store instructions
##

&r_r_ri_asi rd rs1 rs2_or_imm asi imm:bool
@r_r_ri_na  .. rd:5  ...... rs1:5 imm:1 rs2_or_imm:s13     &r_r_ri_asi asi=-1
@d_r_ri_na  .. ..... ...... rs1:5 imm:1 rs2_or_imm:s13     \
            &r_r_ri_asi rd=%dfp_rd asi=-1
@q_r_ri_na  .. ..... ...... rs1:5 imm:1 rs2_or_imm:s13     \
            &r_r_ri_asi rd=%qfp_rd asi=-1

@r_r_r_asi  .. rd:5  ...... rs1:5 0     asi:8 rs2_or_imm:5 &r_r_ri_asi imm=0
@r_r_i_asi  .. rd:5  ...... rs1:5 1     rs2_or_imm:s13     \
            &r_r_ri_asi imm=1 asi=-2
@d_r_r_asi  .. ..... ...... rs1:5 0     asi:8 rs2_or_imm:5 \
            &r_r_ri_asi rd=%dfp_rd imm=0
@d_r_i_asi  .. ..... ...... rs1:5 1     rs2_or_imm:s13     \
            &r_r_ri_asi rd=%dfp_rd imm=1 asi=-2
@q_r_r_asi  .. ..... ...... rs1:5 0     asi:8 rs2_or_imm:5 \
            &r_r_ri_asi rd=%qfp_rd imm=0
@q_r_i_asi  .. ..... ...... rs1:5 1     rs2_or_imm:s13     \
            &r_r_ri_asi rd=%qfp_rd imm=1 asi=-2
@casa_imm   .. rd:5  ...... rs1:5 1 00000000 rs2_or_imm:5  \
            &r_r_ri_asi imm=1 asi=-2

LDUW        11 ..... 000000 ..... . .............          @r_r_ri_na
LDUB        11 ..... 000001 ..... . .............          @r_r_ri_na
LDUH        11 ..... 000010 ..... . .............          @r_r_ri_na
LDD         11 ..... 000011 ..... . .............          @r_r_ri_na
LDSW        11 ..... 001000 ..... . .............          @r_r_ri_na
LDSB        11 ..... 001001 ..... . .............          @r_r_ri_na
LDSH        11 ..... 001010 ..... . .............          @r_r_ri_na
LDX         11 ..... 001011 ..... . .............          @r_r_ri_na

STW         11 ..... 000100 ..... . .............          @r_r_ri_na
STB         11 ..... 000101 ..... . .............          @r_r_ri_na
STH         11 ..... 000110 ..... . .............          @r_r_ri_na
STD         11 ..... 000111 ..... . .............          @r_r_ri_na
STX         11 ..... 001110 ..... . .............          @r_r_ri_na

LDUW        11 ..... 010000 ..... . .............          @r_r_r_asi # LDUWA
LDUW        11 ..... 010000 ..... . .............          @r_r_i_asi # LDUWA
LDUB        11 ..... 010001 ..... . .............          @r_r_r_asi # LDUBA
LDUB        11 ..... 010001 ..... . .............          @r_r_i_asi # LDUBA
LDUH        11 ..... 010010 ..... . .............          @r_r_r_asi # LDUHA
LDUH        11 ..... 010010 ..... . .............          @r_r_i_asi # LDUHA
LDD         11 ..... 010011 ..... . .............          @r_r_r_asi # LDDA
LDD         11 ..... 010011 ..... . .............          @r_r_i_asi # LDDA
LDX         11 ..... 011011 ..... . .............          @r_r_r_asi # LDXA
LDX         11 ..... 011011 ..... . .............          @r_r_i_asi # LDXA
LDSB        11 ..... 011001 ..... . .............          @r_r_r_asi # LDSBA
LDSB        11 ..... 011001 ..... . .............          @r_r_i_asi # LDSBA
LDSH        11 ..... 011010 ..... . .............          @r_r_r_asi # LDSHA
LDSH        11 ..... 011010 ..... . .............          @r_r_i_asi # LDSHA
LDSW        11 ..... 011000 ..... . .............          @r_r_r_asi # LDSWA
LDSW        11 ..... 011000 ..... . .............          @r_r_i_asi # LDSWA

STW         11 ..... 010100 ..... . .............          @r_r_r_asi # STWA
STW         11 ..... 010100 ..... . .............          @r_r_i_asi # STWA
STB         11 ..... 010101 ..... . .............          @r_r_r_asi # STBA
STB         11 ..... 010101 ..... . .............          @r_r_i_asi # STBA
STH         11 ..... 010110 ..... . .............          @r_r_r_asi # STHA
STH         11 ..... 010110 ..... . .............          @r_r_i_asi # STHA
STD         11 ..... 010111 ..... . .............          @r_r_r_asi # STDA
STD         11 ..... 010111 ..... . .............          @r_r_i_asi # STDA
STX         11 ..... 011110 ..... . .............          @r_r_r_asi # STXA
STX         11 ..... 011110 ..... . .............          @r_r_i_asi # STXA

LDF         11 ..... 100000 ..... . .............          @r_r_ri_na
LDFSR       11 00000 100001 ..... . .............          @n_r_ri
LDXFSR      11 00001 100001 ..... . .............          @n_r_ri
LDXEFSR     11 00011 100001 ..... . .............          @n_r_ri
LDQF        11 ..... 100010 ..... . .............          @q_r_ri_na
LDDF        11 ..... 100011 ..... . .............          @d_r_ri_na

STF         11 ..... 100100 ..... . .............          @r_r_ri_na
STFSR       11 00000 100101 ..... . .............          @n_r_ri
STXFSR      11 00001 100101 ..... . .............          @n_r_ri
{
  STQF      11 ..... 100110 ..... . .............          @q_r_ri_na # v9
  STDFQ     11 ----- 100110 ----- - -------------
}
STDF        11 ..... 100111 ..... . .............          @d_r_ri_na

LDSTUB      11 ..... 001101 ..... . .............          @r_r_ri_na
LDSTUB      11 ..... 011101 ..... . .............          @r_r_r_asi # LDSTUBA
LDSTUB      11 ..... 011101 ..... . .............          @r_r_i_asi # LDSTUBA

SWAP        11 ..... 001111 ..... . .............          @r_r_ri_na
SWAP        11 ..... 011111 ..... . .............          @r_r_r_asi # SWAPA
SWAP        11 ..... 011111 ..... . .............          @r_r_i_asi # SWAPA

CASA        11 ..... 111100 ..... . .............          @r_r_r_asi
CASA        11 ..... 111100 ..... . .............          @casa_imm
CASXA       11 ..... 111110 ..... . .............          @r_r_r_asi
CASXA       11 ..... 111110 ..... . .............          @casa_imm

NOP_v9      11 ----- 101101 ----- 0 00000000 -----         # PREFETCH
NOP_v9      11 ----- 101101 ----- 1 -------------          # PREFETCH
NOP_v9      11 ----- 111101 ----- - -------------          # PREFETCHA

{
  [
    LDFA    11 ..... 110000 ..... . .............          @r_r_r_asi
    LDFA    11 ..... 110000 ..... . .............          @r_r_i_asi
  ]
  NCP       11 ----- 110000 ----- --------- -----          # v8 LDC
}
NCP         11 ----- 110001 ----- --------- -----          # v8 LDCSR
LDQFA       11 ..... 110010 ..... . .............          @q_r_r_asi
LDQFA       11 ..... 110010 ..... . .............          @q_r_i_asi
{
  [
    LDDFA   11 ..... 110011 ..... . .............          @d_r_r_asi
    LDDFA   11 ..... 110011 ..... . .............          @d_r_i_asi
  ]
  NCP       11 ----- 110011 ----- --------- -----          # v8 LDDC
}

{
  [
    STFA    11 ..... 110100 ..... . .............          @r_r_r_asi
    STFA    11 ..... 110100 ..... . .............          @r_r_i_asi
  ]
  NCP       11 ----- 110100 ----- --------- -----          # v8 STC
}
NCP         11 ----- 110101 ----- --------- -----          # v8 STCSR
{
  [
    STQFA   11 ..... 110110 ..... . .............          @q_r_r_asi
    STQFA   11 ..... 110110 ..... . .............          @q_r_i_asi
  ]
  NCP       11 ----- 110110 ----- --------- -----          # v8 STDCQ
}
{
  [
    STDFA   11 ..... 110111 ..... . .............          @d_r_r_asi
    STDFA   11 ..... 110111 ..... . .............          @d_r_i_asi
  ]
  NCP       11 ----- 110111 ----- --------- -----          # v8 STDC
}