[Next] [Up] [Previous] [Next Section]

Advanced Compound Mode and Related Modes

In Advanced Compound Mode, the basic memory-reference instructions have the following form:

Note that no large area of opcode space remains for the operate instructions; instead, they, like other less-used instructions, will have an extra 16-bit prefix.

Six-bit opcodes allow access to the basic data types of 8, 16, and 32-bit fixed point, and 32 and 64-bit floating point. In addition to the standard register-to-register, memory reference, and indexed modes, a scratchpad mode is available, where the destination operand is one of registers 0 through 3, and the source one of the 64 supplementary registers. The shift instruction is available in a short 16-bit form as well.

Also shown is a longer instruction format in which opcodes are 12 bits long to permit access to additional data types. The long vector instructions, to be described later, will have a nine-bit opcode.

In the instructions where the opcode is twelve bits long, the most significant six bits of the opcode are in the first halfword, and the least significant six bits of the opcode are in the second halfword. In these instructions with nine-bit opcodes, however, to keep as many of the least significant bits of the opcode contiguous as possible, the first halfword contains the least significant six bits of the opcode, and the second halfword contains the most significant three bits of the opcode. Thus, the opcodes of the instructions in the two basic instruction formats seen so far are shown in the first two columns; and the format with nine-bit opcodes to be seen on a later page is shown in the third column. The fourth column shows opcodes for mixed operation mode, to be described below. The opcodes are:

0x00xx     120400 000xxx     142x00 00xxxx             SWB    Swap Byte
0x01xx     120400 001xxx     142x01 00xxxx             CB     Compare Byte
0x02xx     120400 002xxx     142x02 00xxxx             LB     Load Byte
0x03xx     120400 003xxx     142x03 00xxxx             STB    Store Byte
0x04xx     120400 004xxx     142x04 00xxxx             AB     Add Byte
0x05xx     120400 005xxx     142x05 00xxxx             SB     Subtract Byte

0x10xx     120400 010xxx     142x10 00xxxx             IB     Insert Byte
0x11xx     120400 011xxx     142x11 00xxxx             UCB    Unsigned Compare Byte
0x12xx     120400 012xxx     142x12 00xxxx             ULB    Unsigned Load Byte
0x13xx     120400 013xxx     142x13 00xxxx             XB     XOR Byte
0x14xx     120400 014xxx     142x14 00xxxx             NB     AND Byte
0x15xx     120400 015xxx     142x15 00xxxx             OB     OR Byte

0x17xx     120400 017xxx     142x17 00xxxx             STGB   Store if Greater Byte

0x20xx     120400 020xxx     142x20 00xxxx             SWB    Swap Halfword
0x21xx     120400 021xxx     142x21 00xxxx             CB     Compare Halfword
0x22xx     120400 022xxx     142x22 00xxxx             LB     Load Halfword
0x23xx     120400 023xxx     142x23 00xxxx             STB    Store Halfword
0x24xx     120400 024xxx     142x24 00xxxx             AB     Add Halfword
0x25xx     120400 025xxx     142x25 00xxxx             SB     Subtract Halfword
0x26xx     120400 026xxx     142x26 00xxxx             MH     Multiply Halfword
0x27xx     120400 027xxx     142x27 00xxxx             DH     Divide Halfword

0x30xx     120400 030xxx     142x30 00xxxx             IB     Insert Halfword
0x31xx     120400 031xxx     142x31 00xxxx             UCB    Unsigned Compare Halfword
0x32xx     120400 032xxx     142x32 00xxxx             ULB    Unsigned Load Halfword
0x33xx     120400 033xxx     142x33 00xxxx             XB     XOR Halfword
0x34xx     120400 034xxx     142x34 00xxxx             NB     AND Halfword
0x35xx     120400 035xxx     142x35 00xxxx             OB     OR Halfword
0x36xx     120400 036xxx     142x36 00xxxx             MEH    Multiply Extensibly Halfword
0x37xx     120400 037xxx     142x37 00xxxx             DEH    Divide Extensibly Halfword

0x40xx     120400 040xxx     142x40 00xxxx             SW     Swap
0x41xx     120400 041xxx     142x41 00xxxx             C      Compare
0x42xx     120400 042xxx     142x42 00xxxx             L      Load
0x43xx     120400 043xxx     142x43 00xxxx             ST     Store
0x44xx     120400 044xxx     142x44 00xxxx             A      Add
0x45xx     120400 045xxx     142x45 00xxxx             S      Subtract
0x46xx     120400 046xxx     142x46 00xxxx             M      Multiply
0x47xx     120400 047xxx     142x47 00xxxx             D      Divide

0x51xx     120400 051xxx     142x51 00xxxx             UC     Unsigned Compare

0x53xx     120400 053xxx     142x53 00xxxx             X      XOR
0x54xx     120400 054xxx     142x54 00xxxx             N      AND
0x55xx     120400 055xxx     142x55 00xxxx             O      OR
0x56xx     120400 056xxx     142x56 00xxxx             ME     Multiply Extensibly
0x57xx     120400 057xxx     142x57 00xxxx             DE     Divide Extensibly

           120400 060xxx     142x60 00xxxx     1x00xx  SWL    Swap Long
           120400 061xxx     142x61 00xxxx     1x01xx  CL     Compare Long
           120400 062xxx     142x62 00xxxx     1x02xx  LL     Load Long
           120400 063xxx     142x63 00xxxx     1x03xx  STL    Store Long
           120400 064xxx     142x64 00xxxx     1x04xx  AL     Add Long
           120400 065xxx     142x65 00xxxx     1x05xx  SL     Subtract Long
           120400 066xxx     142x66 00xxxx     1x06xx  ML     Multiply Long
           120400 067xxx     142x67 00xxxx     1x07xx  DL     Divide Long

           120400 070xxx     142x70 00xxxx     1x10xx  UCL    Unsigned Compare Long

           120400 073xxx     142x73 00xxxx     1x13xx  XL     XOR Long
           120400 074xxx     142x74 00xxxx     1x14xx  NL     AND Long
           120400 075xxx     142x75 00xxxx     1x15xx  OL     OR Long
           120400 076xxx     142x76 00xxxx     1x16xx  MEL    Multiply Extensibly Long
           120400 077xxx     142x77 00xxxx     1x17xx  DEL    Divide Extensibly Long

           120401 000xxx     142x00 01xxxx     1x40xx  SWM    Swap Medium
           120401 001xxx     142x01 01xxxx     1x41xx  CM     Compare Medium
           120401 002xxx     142x02 01xxxx     1x42xx  LM     Load Medium
           120401 003xxx     142x03 01xxxx     1x43xx  STM    Store Medium
           120401 004xxx     142x04 01xxxx     1x44xx  AM     Add Medium
           120401 005xxx     142x05 01xxxx     1x45xx  SM     Subtract Medium
           120401 006xxx     142x06 01xxxx     1x46xx  MM     Multiply Medium
           120401 007xxx     142x07 01xxxx     1x47xx  DM     Divide Medium

           120401 010xxx     142x10 01xxxx     1x50xx  MEUM   Multiply Extensibly Unnormalized Medium
           120401 011xxx     142x11 01xxxx     1x51xx  DEUM   Divide Extensibly Unnormalized Medium
           120401 012xxx     142x12 01xxxx     1x52xx  LUM    Load Unnormalized Medium
           120401 013xxx     142x13 01xxxx     1x53xx  STUM   Store Unnormalized Medium
           120401 014xxx     142x14 01xxxx     1x54xx  AUM    Add Unnormalized Medium
           120401 015xxx     142x15 01xxxx     1x55xx  SUM    Subtract Unnormalized Medium
           120401 016xxx     142x16 01xxxx     1x56xx  MUM    Multiply Unnormalized Medium
           120401 017xxx     142x17 01xxxx     1x57xx  DUM    Divide Unnormalized Medium

0x60xx     120401 020xxx     142x20 01xxxx             SWF    Swap Floating
0x61xx     120401 021xxx     142x21 01xxxx             CF     Compare Floating
0x62xx     120401 022xxx     142x22 01xxxx             LF     Load Floating
0x63xx     120401 023xxx     142x23 01xxxx             STF    Store Floating
0x64xx     120401 024xxx     142x24 01xxxx             AF     Add Floating
0x65xx     120401 025xxx     142x25 01xxxx             SF     Subtract Floating
0x66xx     120401 026xxx     142x26 01xxxx             MF     Multiply Floating
0x67xx     120401 027xxx     142x27 01xxxx             DF     Divide Floating

           120401 030xxx     142x30 01xxxx     1x60xx  MEU    Multiply Extensibly Unnormalized
           120401 031xxx     142x31 01xxxx     1x61xx  DEU    Divide Extensibly Unnormalized
           120401 032xxx     142x32 01xxxx     1x62xx  LU     Load Unnormalized
           120401 033xxx     142x33 01xxxx     1x63xx  STU    Store Unnormalized
           120401 034xxx     142x34 01xxxx     1x64xx  AU     Add Unnormalized
           120401 035xxx     142x35 01xxxx     1x65xx  SU     Subtract Unnormalized
           120401 036xxx     142x36 01xxxx     1x66xx  MU     Multiply Unnormalized
           120401 037xxx     142x37 01xxxx     1x67xx  DU     Divide Unnormalized

0x70xx     120401 040xxx     142x40 01xxxx             SWD    Swap Double
0x71xx     120401 041xxx     142x41 01xxxx             CD     Compare Double
0x72xx     120401 042xxx     142x42 01xxxx             LD     Load Double
0x73xx     120401 043xxx     142x43 01xxxx             STD    Store Double
0x74xx     120401 044xxx     142x44 01xxxx             AD     Add Double
0x75xx     120401 045xxx     142x45 01xxxx             SD     Subtract Double
0x76xx     120401 046xxx     142x46 01xxxx             MD     Multiply Double
0x77xx     120401 047xxx     142x47 01xxxx             DD     Divide Double

           120401 050xxx     142x50 01xxxx     1x70xx  MEUD   Multiply Extensibly Unnormalized Double
           120401 051xxx     142x51 01xxxx     1x71xx  DEUD   Divide Extensibly Unnormalized Double
           120401 052xxx     142x52 01xxxx     1x72xx  LUD    Load Unnormalized Double
           120401 053xxx     142x53 01xxxx     1x73xx  STUD   Store Unnormalized Double
           120401 054xxx     142x54 01xxxx     1x74xx  AUD    Add Unnormalized Double
           120401 055xxx     142x55 01xxxx     1x75xx  SUD    Subtract Unnormalized Double
           120401 056xxx     142x56 01xxxx     1x76xx  MUD    Multiply Unnormalized Double
           120401 057xxx     142x57 01xxxx     1x77xx  DUD    Divide Unnormalized Double

           120401 060xxx     142x60 01xxxx     1x20xx  SWQ    Swap Quad
           120401 061xxx     142x61 01xxxx     1x21xx  CQ     Compare Quad
           120401 062xxx     142x62 01xxxx     1x22xx  LQ     Load Quad
           120401 063xxx     142x63 01xxxx     1x23xx  STQ    Store Quad
           120401 064xxx     142x64 01xxxx     1x24xx  AQ     Add Quad
           120401 065xxx     142x65 01xxxx     1x25xx  SQ     Subtract Quad
           120401 066xxx     142x66 01xxxx     1x26xx  MQ     Multiply Quad
           120401 067xxx     142x67 01xxxx     1x27xx  DQ     Divide Quad

           120401 070xxx     142x70 01xxxx     1x30xx  MEUQ   Multiply Extensibly Unnormalized Quad
           120401 071xxx     142x71 01xxxx     1x31xx  DEUQ   Divide Extensibly Unnormalized Quad
           120401 072xxx     142x72 01xxxx     1x32xx  LUQ    Load Unnormalized Quad
           120401 073xxx     142x73 01xxxx     1x33xx  STUQ   Store Unnormalized Quad
           120401 074xxx     142x74 01xxxx     1x34xx  AUQ    Add Unnormalized Quad
           120401 075xxx     142x75 01xxxx     1x35xx  SUQ    Subtract Unnormalized Quad
           120401 076xxx     142x76 01xxxx     1x36xx  MUQ    Multiply Unnormalized Quad
           120401 077xxx     142x77 01xxxx     1x37xx  DUQ    Divide Unnormalized Quad

           120402 020xxx     142x20 02xxxx             SFSWL  Simple Floating Swap Halfword
           120402 021xxx     142x21 02xxxx             SFCL   Simple Floating Compare Halfword
           120402 022xxx     142x22 02xxxx             SFLL   Simple Floating Load Halfword
           120402 023xxx     142x23 02xxxx             SFSTL  Simple Floating Store Halfword
           120402 024xxx     142x24 02xxxx             SFAL   Simple Floating Add Halfword
           120402 025xxx     142x25 02xxxx             SFSL   Simple Floating Subtract Halfword
           120402 026xxx     142x26 02xxxx             SFML   Simple Floating Multiply Halfword
           120402 027xxx     142x27 02xxxx             SFDL   Simple Floating Divide Halfword

           120402 030xxx     142x30 02xxxx             SFMEUH Simple Floating Multiply Extensibly Unnormalized Halfword
           120402 031xxx     142x31 02xxxx             SFDEUH Simple Floating Divide Extensibly Unnormalized Halfword
           120402 032xxx     142x32 02xxxx             SFLUH  Simple Floating Load Unnormalized Halfword
           120402 033xxx     142x33 02xxxx             SFSTUH Simple Floating Store Unnormalized Halfword
           120402 034xxx     142x34 02xxxx             SFAUH  Simple Floating Add Unnormalized Halfword
           120402 035xxx     142x35 02xxxx             SFSUH  Simple Floating Subtract Unnormalized Halfword
           120402 036xxx     142x36 02xxxx             SFMUH  Simple Floating Multiply Unnormalized Halfword
           120402 037xxx     142x37 02xxxx             SFDUH  Simple Floating Divide Unnormalized Halfword

           120402 040xxx     142x40 02xxxx             SFSW   Simple Floating Swap
           120402 041xxx     142x41 02xxxx             SFC    Simple Floating Compare
           120402 042xxx     142x42 02xxxx             SFL    Simple Floating Load
           120402 043xxx     142x43 02xxxx             SFST   Simple Floating Store
           120402 044xxx     142x44 02xxxx             SFA    Simple Floating Add
           120402 045xxx     142x45 02xxxx             SFS    Simple Floating Subtract
           120402 046xxx     142x46 02xxxx             SFM    Simple Floating Multiply
           120402 047xxx     142x47 02xxxx             SFD    Simple Floating Divide

           120402 050xxx     142x50 02xxxx             SFMEU  Simple Floating Multiply Extensibly Unnormalized
           120402 051xxx     142x51 02xxxx             SFDEU  Simple Floating Divide Extensibly Unnormalized
           120402 052xxx     142x52 02xxxx             SFLU   Simple Floating Load Unnormalized
           120402 053xxx     142x53 02xxxx             SFSTU  Simple Floating Store Unnormalized
           120402 054xxx     142x54 02xxxx             SFAU   Simple Floating Add Unnormalized
           120402 055xxx     142x55 02xxxx             SFSU   Simple Floating Subtract Unnormalized
           120402 056xxx     142x56 02xxxx             SFMU   Simple Floating Multiply Unnormalized
           120402 057xxx     142x57 02xxxx             SFDU   Simple Floating Divide Unnormalized

           120402 060xxx     142x60 02xxxx             SFSWL  Simple Floating Swap Long
           120402 061xxx     142x61 02xxxx             SFCL   Simple Floating Compare Long
           120402 062xxx     142x62 02xxxx             SFLL   Simple Floating Load Long
           120402 063xxx     142x63 02xxxx             SFSTL  Simple Floating Store Long
           120402 064xxx     142x64 02xxxx             SFAL   Simple Floating Add Long
           120402 065xxx     142x65 02xxxx             SFSL   Simple Floating Subtract Long
           120402 066xxx     142x66 02xxxx             SFML   Simple Floating Multiply Long
           120402 067xxx     142x67 02xxxx             SFDL   Simple Floating Divide Long

           120402 070xxx     142x70 02xxxx             SFMEUL Simple Floating Multiply Extensibly Unnormalized Long
           120402 071xxx     142x71 02xxxx             SFDEUL Simple Floating Divide Extensibly Unnormalized Long
           120402 072xxx     142x72 02xxxx             SFLUL  Simple Floating Load Unnormalized Long
           120402 073xxx     142x73 02xxxx             SFSTUL Simple Floating Store Unnormalized Long
           120402 074xxx     142x74 02xxxx             SFAUL  Simple Floating Add Unnormalized Long
           120402 075xxx     142x75 02xxxx             SFSUL  Simple Floating Subtract Unnormalized Long
           120402 076xxx     142x76 02xxxx             SFMUL  Simple Floating Multiply Unnormalized Long
           120402 077xxx     142x77 02xxxx             SFDUL  Simple Floating Divide Unnormalized Long

           120403 001xxx     142x01 03xxxx             RPC    Register Packed Compare
           120403 002xxx     142x02 03xxxx             RPME   Register Packed Multiply Extensibly
           120403 003xxx     142x03 03xxxx             RPDE   Register Packed Divide Extensibly
           120403 004xxx     142x04 03xxxx             RPA    Register Packed Add
           120403 005xxx     142x05 03xxxx             RPS    Register Packed Subtract
           120403 006xxx     142x06 03xxxx             RPM    Register Packed Multiply
           120403 007xxx     142x07 03xxxx             RPD    Register Packed Divide

           120403 011xxx     142x11 03xxxx             RPCL   Register Packed Compare Long
           120403 012xxx     142x12 03xxxx             RPMEL  Register Packed Multiply Extensibly Long
           120403 013xxx     142x13 03xxxx             RPDEL  Register Packed Divide Extensibly Long
           120403 014xxx     142x14 03xxxx             RPAL   Register Packed Add Long
           120403 015xxx     142x15 03xxxx             RPSL   Register Packed Subtract Long
           120403 016xxx     142x16 03xxxx             RPML   Register Packed Multiply Long
           120403 017xxx     142x17 03xxxx             RPDL   Register Packed Divide Long

           120403 021xxx     142x21 03xxxx             RCDC   Register Compressed Decimal Compare
           120403 022xxx     142x22 03xxxx             RCDME  Register Compressed Decimal Multiply Extensibly
           120403 023xxx     142x23 03xxxx             RCDDE  Register Compressed Decimal Divide Extensibly
           120403 024xxx     142x24 03xxxx             RCDA   Register Compressed Decimal Add
           120403 025xxx     142x25 03xxxx             RCDS   Register Compressed Decimal Subtract
           120403 026xxx     142x26 03xxxx             RCDM   Register Compressed Decimal Multiply
           120403 027xxx     142x27 03xxxx             RCDD   Register Compressed Decimal Divide

           120403 031xxx     142x31 03xxxx             RCDCL  Register Compressed Decimal Compare Long
           120403 032xxx     142x32 03xxxx             RCDMEL Register Compressed Decimal Multiply Extensibly Long
           120403 033xxx     142x33 03xxxx             RCDDEL Register Compressed Decimal Divide Extensibly Long
           120403 034xxx     142x34 03xxxx             RCDAL  Register Compressed Decimal Add Long
           120403 035xxx     142x35 03xxxx             RCDSL  Register Compressed Decimal Subtract Long
           120403 036xxx     142x36 03xxxx             RCDML  Register Compressed Decimal Multiply Long
           120403 037xxx     142x37 03xxxx             RCDDL  Register Compressed Decimal Divide Long

           120403 040xxx     142x40 03xxxx             SWMDE  Swap Medium Decimal Exponent
           120403 041xxx     142x41 03xxxx             CMDE   Compare Medium Decimal Exponent
           120403 042xxx     142x42 03xxxx             LMDE   Load Medium Decimal Exponent
           120403 043xxx     142x43 03xxxx             STMDE  Store Medium Decimal Exponent
           120403 044xxx     142x44 03xxxx             AMDE   Add Medium Decimal Exponent
           120403 045xxx     142x45 03xxxx             SMDE   Subtract Medium Decimal Exponent
           120403 046xxx     142x46 03xxxx             MMDE   Multiply Medium Decimal Exponent
           120403 047xxx     142x47 03xxxx             DMDE   Divide Medium Decimal Exponent

           120403 052xxx     142x52 03xxxx             LUMDE  Load Unnormalized Medium Decimal Exponent
           120403 053xxx     142x53 03xxxx             STUMDE Store Unnormalized Medium Decimal Exponent
           120403 054xxx     142x54 03xxxx             AUMDE  Add Unnormalized Medium Decimal Exponent
           120403 055xxx     142x55 03xxxx             SUMDE  Subtract Unnormalized Medium Decimal Exponent
           120403 056xxx     142x56 03xxxx             MUMDE  Multiply Unnormalized Medium Decimal Exponent
           120403 057xxx     142x57 03xxxx             DUMDE  Divide Unnormalized Medium Decimal Exponent

           120403 060xxx     142x60 03xxxx             SWDDE Swap Double Decimal Exponent
           120403 061xxx     142x61 03xxxx             CDDE  Compare Double Decimal Exponent
           120403 062xxx     142x62 03xxxx             LDDE  Load Double Decimal Exponent
           120403 063xxx     142x63 03xxxx             STDDE Store Double Decimal Exponent
           120403 064xxx     142x64 03xxxx             ADDE  Add Double Decimal Exponent
           120403 065xxx     142x65 03xxxx             SDDE  Subtract Double Decimal Exponent
           120403 066xxx     142x66 03xxxx             MDDE  Multiply Double Decimal Exponent
           120403 067xxx     142x67 03xxxx             DDDE  Divide Double Decimal Exponent

           120403 072xxx     142x72 03xxxx             LUDDE  Load Unnormalized Double Decimal Exponent
           120403 073xxx     142x73 03xxxx             STUDDE Store Unnormalized Double Decimal Exponent
           120403 074xxx     142x74 03xxxx             AUDDE  Add Unnormalized Double Decimal Exponent
           120403 075xxx     142x75 03xxxx             SUDDE  Subtract Unnormalized Double Decimal Exponent
           120403 076xxx     142x76 03xxxx             MUDDE  Multiply Unnormalized Double Decimal Exponent
           120403 077xxx     142x77 03xxxx             DUDDE  Divide Unnormalized Double Decimal Exponent

           120404 054xxx     142x54 04xxxx             AMDEH  Add Medium Decimal Exponent Humanized
           120404 055xxx     142x55 04xxxx             SMDEH  Subtract Medium Decimal Exponent Humanized
           120404 056xxx     142x56 04xxxx             MMDEH  Multiply Medium Decimal Exponent Humanized
           120404 057xxx     142x57 04xxxx             DMDEH  Divide Medium Decimal Exponent Humanized

           120404 074xxx     142x74 04xxxx             ADDEH  Add Double Decimal Exponent Humanized
           120404 075xxx     142x75 04xxxx             SDDEH  Subtract Double Decimal Exponent Humanized
           120404 076xxx     142x76 04xxxx             MDDEH  Multiply Double Decimal Exponent Humanized
           120404 077xxx     142x77 04xxxx             DDDEH  Divide Double Decimal Exponent Humanized

           120405 000xxx     142x00 05xxxx             SWFRC   Swap Floating Register Compressed
           120405 001xxx     142x01 05xxxx             CFRC    Compare Floating Register Compressed
           120405 002xxx     142x02 05xxxx             LFRC    Load Floating Register Compressed
           120405 003xxx     142x03 05xxxx             STFRC   Store Floating Register Compressed
           120405 004xxx     142x04 05xxxx             AFRC    Add Floating Register Compressed
           120405 005xxx     142x05 05xxxx             SFRC    Subtract Floating Register Compressed
           120405 006xxx     142x06 05xxxx             MFRC    Multiply Floating Register Compressed
           120405 007xxx     142x07 05xxxx             DFRC    Divide Floating Register Compressed

           120405 012xxx     142x12 05xxxx             LUFRC   Load Unnormalized Floating Register Compressed
           120405 013xxx     142x13 05xxxx             STUFRC  Store Unnormalized Floating Register Compressed
           120405 014xxx     142x14 05xxxx             AUFRC   Add Unnormalized Floating Register Compressed
           120405 015xxx     142x15 05xxxx             SUFRC   Subtract Unnormalized Floating Register Compressed
           120405 016xxx     142x16 05xxxx             MUFRC   Multiply Unnormalized Floating Register Compressed
           120405 017xxx     142x17 05xxxx             DUFRC   Divide Unnormalized Floating Register Compressed

           120405 024xxx     142x24 05xxxx             AFRCH   Add Floating Register Compressed Humanized
           120405 025xxx     142x25 05xxxx             SFRCH   Subtract Floating Register Compressed Humanized
           120405 026xxx     142x26 05xxxx             MFRCH   Multiply Floating Register Compressed Humanized
           120405 027xxx     142x27 05xxxx             DFRCH   Divide Floating Register Compressed Humanized

           120405 040xxx     142x40 05xxxx             SWDRC   Swap Double Register Compressed
           120405 041xxx     142x41 05xxxx             CDRC    Compare Double Register Compressed
           120405 042xxx     142x42 05xxxx             LDRC    Load Double Register Compressed
           120405 043xxx     142x43 05xxxx             STDRC   Store Double Register Compressed
           120405 044xxx     142x44 05xxxx             ADRC    Add Double Register Compressed
           120405 045xxx     142x45 05xxxx             SDRC    Subtract Double Register Compressed
           120405 046xxx     142x46 05xxxx             MDRC    Multiply Double Register Compressed
           120405 047xxx     142x47 05xxxx             DDRC    Divide Double Register Compressed

           120405 052xxx     142x52 05xxxx             LUDRC   Load Unnormalized Double Register Compressed
           120405 053xxx     142x53 05xxxx             STUDRC  Store Unnormalized Double Register Compressed
           120405 054xxx     142x54 05xxxx             AUDRC   Add Unnormalized Double Register Compressed
           120405 055xxx     142x55 05xxxx             SUDRC   Subtract Unnormalized Double Register Compressed
           120405 056xxx     142x56 05xxxx             MUDRC   Multiply Unnormalized Double Register Compressed
           120405 057xxx     142x67 05xxxx             DUDRC   Divide Unnormalized Double Register Compressed

           120405 064xxx     142x64 05xxxx             AFDCH   Add Double Register Compressed Humanized
           120405 065xxx     142x65 05xxxx             SFDCH   Subtract Double Register Compressed Humanized
           120405 066xxx     142x66 05xxxx             MFDCH   Multiply Double Register Compressed Humanized
           120405 067xxx     142x67 05xxxx             DFDCH   Divide Double Register Compressed Humanized

           120406 000xxx     142x00 06xxxx             SWQRC   Swap Quad Register Compressed
           120406 001xxx     142x01 06xxxx             CQRC    Compare Quad Register Compressed
           120406 002xxx     142x02 06xxxx             LQRC    Load Quad Register Compressed
           120406 003xxx     142x03 06xxxx             STQRC   Store Quad Register Compressed
           120406 004xxx     142x04 06xxxx             AQRC    Add Quad Register Compressed
           120406 005xxx     142x05 06xxxx             SQRC    Subtract Quad Register Compressed
           120406 006xxx     142x06 06xxxx             MQRC    Multiply Quad Register Compressed
           120406 007xxx     142x07 06xxxx             DQRC    Divide Quad Register Compressed

           120406 012xxx     142x12 06xxxx             LUQRC   Load Unnormalized Quad Register Compressed
           120406 013xxx     142x13 06xxxx             STUQRC  Store Unnormalized Quad Register Compressed
           120406 014xxx     142x14 06xxxx             AUQRC   Add Unnormalized Quad Register Compressed
           120406 015xxx     142x15 06xxxx             SUQRC   Subtract Unnormalized Quad Register Compressed
           120406 016xxx     142x16 06xxxx             MUQRC   Multiply Unnormalized Quad Register Compressed
           120406 017xxx     142x17 06xxxx             DUQRC   Divide Unnormalized Quad Register Compressed

           120406 024xxx     142x24 06xxxx             AFDCH   Add Quad Register Compressed Humanized
           120406 025xxx     142x25 06xxxx             SFDCH   Subtract Quad Register Compressed Humanized
           120406 026xxx     142x26 06xxxx             MFDCH   Multiply Quad Register Compressed Humanized
           120406 027xxx     142x27 06xxxx             DFDCH   Divide Quad Register Compressed Humanized

           120406 040xxx     142x40 06xxxx             SWNFRC  Swap Numerical Floating Register Compressed
           120406 041xxx     142x41 06xxxx             CNFRC   Compare Numerical Floating Register Compressed
           120406 042xxx     142x42 06xxxx             LNFRC   Load Numerical Floating Register Compressed
           120406 043xxx     142x43 06xxxx             STNFRC  Store Numerical Floating Register Compressed
           120406 044xxx     142x44 06xxxx             ANFRC   Add Numerical Floating Register Compressed
           120406 045xxx     142x45 06xxxx             SNFRC   Subtract Numerical Floating Register Compressed
           120406 046xxx     142x46 06xxxx             MNFRC   Multiply Numerical Floating Register Compressed
           120406 047xxx     142x47 06xxxx             DNFRC   Divide Numerical Floating Register Compressed

           120406 050xxx     142x50 06xxxx             SWNDRC  Swap Numerical Double Register Compressed
           120406 051xxx     142x51 06xxxx             CNDRC   Compare Numerical Double Register Compressed
           120406 052xxx     142x52 06xxxx             LNDRC   Load Numerical Double Register Compressed
           120406 053xxx     142x53 06xxxx             STNDRC  Store Numerical Double Register Compressed
           120406 054xxx     142x54 06xxxx             ANDRC   Add Numerical Double Register Compressed
           120406 055xxx     142x55 06xxxx             SNDRC   Subtract Numerical Double Register Compressed
           120406 056xxx     142x56 06xxxx             MNDRC   Multiply Numerical Double Register Compressed
           120406 057xxx     142x57 06xxxx             DNDRC   Divide Numerical Double Register Compressed

           120406 060xxx     142x60 06xxxx             SWNQRC  Swap Numerical Quad Register Compressed
           120406 061xxx     142x61 06xxxx             CNQRC   Compare Numerical Quad Register Compressed
           120406 062xxx     142x62 06xxxx             LNQRC   Load Numerical Quad Register Compressed
           120406 063xxx     142x63 06xxxx             STNQRC  Store Numerical Quad Register Compressed
           120406 064xxx     142x64 06xxxx             ANQRC   Add Numerical Quad Register Compressed
           120406 065xxx     142x65 06xxxx             SNQRC   Subtract Numerical Quad Register Compressed
           120406 066xxx     142x66 06xxxx             MNQRC   Multiply Numerical Quad Register Compressed
           120406 067xxx     142x67 06xxxx             DNQRC   Divide Numerical Quad Register Compressed

In this mode, the opcodes of the shift instructions are:

140xxx   SHLB    Shift Left Byte
141xxx   SHRB    Shift Right Byte

143xxx   ASRB    Arithmetic Shift Right Byte
144xxx   ROLB    Rotate Left Byte
145xxx   RORB    Rotate Right Byte
146xxx   RLCB    Rotate Left through Carry Byte
147xxx   RRCB    Rotate Right through Carry Byte

150xxx   SHLH    Shift Left Halfword
151xxx   SHRH    Shift Right Halfword

153xxx   ASRH    Arithmetic Shift Right Halfword
154xxx   ROLH    Rotate Left Halfword
155xxx   RORH    Rotate Right Halfword
156xxx   RLCH    Rotate Left through Carry Halfword
157xxx   RRCH    Rotate Right through Carry Halfword

160xxx   SHL     Shift Left
161xxx   SHR     Shift Right

163xxx   ASR     Arithmetic Shift Right
164xxx   ROL     Rotate Left
165xxx   ROR     Rotate Right
166xxx   RLC     Rotate Left through Carry
167xxx   RRC     Rotate Right through Carry

170xxx   SHLL    Shift Left Long
171xxx   SHRL    Shift Right Long

173xxx   ASRL    Arithmetic Shift Right Long
174xxx   ROLL    Rotate Left Long
175xxx   RORL    Rotate Right Long
176xxx   RLCL    Rotate Left through Carry Long
177xxx   RRCL    Rotate Right through Carry Long

The unused operand 2 for a shift instruction is used to form 16-bit prefixes which extend the instruction repertoire. Shown in the diagram is the simplest extension provided, in which the opcode field is extended to 12 bits, but the addressing modes are essentially unchanged, except for allowing all eight registers to be the destination of a scratchpad instruction. The 12-bit opcodes are defined to be the same as the 8-bit opcodes used in full opcode mode, with nonzero values of the first four bits reserved for future expansion.

Other prefix values will allow additional addressing modes, particularly for vector operations, and will prefix such operate instructions as the conditional jump instructions or the packed decimal arithmetic instructions.

Among the instructions which remain to be defined, the conditional jump and subroutine jump instructions are relatively common instructions. Fortunately, there is sufficient opcode space among the unused shift instructions so that lengthening them can be avoided. This is not also true for the branch instructions; but the long branch instructions, in which the case where the base register is zero is defined as indicating a branch instruction with a 16-bit signed displacement, remain available.

Thus, the opcodes for these instructions are:

152xxx            JMS     Jump to Subroutine
152xx0            BRS     Branch to Subroutine

1621xx            JL      Jump if Low
1622xx            JE      Jump if Equal
1623xx            JLE     Jump if Low or Equal
1624xx            JH      Jump if High
1625xx            JNE     Jump if Not Equal
1626xx            JHE     Jump if High or Equal
1627xx            JNV     Jump if No Overflow

1720xx            JV      Jump if Overflow

1722xx            JC      Jump if Carry
1723xx            JNC     Jump if No Carry

1727xx            JMP     Jump

1621x0            LBL     Long Branch if Low
1622x0            LBE     Long Branch if Equal
1623x0            LBLE    Long Branch if Low or Equal
1624x0            LBH     Long Branch if High
1625x0            LBNE    Long Branch if Not Equal
1626x0            LBHE    Long Branch if High or Equal
1627x0            LBNV    Long Branch if No Overflow

1720x0            LBV     Long Branch if Overflow

1722x0            LBC     Long Branch if Carry
1723x0            LBNC    Long Branch if No Carry

1727x0            LBRA    Long Branch

If indexed addressing is used in a jump or long branch instruction, the instruction does not jump to the memory location at the effective address, but instead to the location whose address it contains. This addressing mode, post-indexed indirect addressing, allows branching to one of several locations in a list. This also applies to the JMS and BRS instructions.

For the long vector instructions, it will be necessary to reduce the length of the opcode field from 12 bits to 9 bits, still more than the 8 bits currently used, and to use a considerable proportion of the remaining opcode space available for prefixes.

Providing the operate instructions with a 16-bit prefix ensures that ample opcode space will remain for the long vector and extended operate instructions also provided in this mode. First, the character and packed decimal instructions are shown:

and then the remaining operate instructions:

Modified Normal Mode

Although advanced compound mode was designed so as to allow efficient and full access to the entire architecture without any further requirement for switching to other instruction modes, some choice and flexibility may still be felt desirable.

Thus, where convenient and efficient access to 64-bit fixed point, and 48-bit and 128-bit floating point outweighs the added compactness provided by the 16-bit scratchpad instructions, a modification of this mode that uses the same conventional memory reference instructions as normal mode is presented:

Mixed Operation Mode

This mode attempts to combine the benefits of modified normal mode with having short memory-reference instructions for alternate types as well. This is done by moving to six-bit opcodes for the memory-reference instructions whose format resembles that of normal mode, and then having a second set of six-bit opcodes for additional types, giving the supplementary memory reference instructions. The opcodes involved are listed in the table above; unfortunately, opcode space is sufficiently limited that only the unnormalized floating-point instructions benefit from this measure, which works by limiting indexed memory reference instructions to register 0 as their destination register.

Thus, the first group of memory-reference instructions uses the default 6-bit opcode set, providing support for byte, halfword, and word fixed-point types, and for normalized floating and double operations; the long fixed-point type, unnormalized floating and double operations, as well as normalized and unnormalized medium and quad operations are in the supplementary set.

Due to the interconnectedness of those two sets of opcodes, opcode translation is not provided in this mode.

Then, there is a third set of opcodes: sixteen opcodes are available for the auxilliary memory reference instructions. As this is enough only to select an opcode for a single type of operand, a five-bit field in the Program Status Block, the last three bits of which having already been used to indicate the type of operands in the plain scratchpad modes and in the stack modes, is used to indicate which type of operands is handled by these instructions.

In this mode, another limitation of these modes, arising from adding 16 bits to the length to all the operate instructions except the shift instructions, is corrected: the conditional branch instructions can once again have 16-bit opcodes, and they are:

1361xx            BL      Branch if Low
1362xx            BE      Branch if Equal
1363xx            BLE     Branch if Low or Equal
1364xx            BH      Branch if High
1365xx            BNE     Branch if Not Equal
1366xx            BHE     Branch if High or Equal
1367xx            BNV     Branch if No Overflow

1370xx            BV      Branch if Overflow

1372xx            BC      Branch if Carry
1373xx            BNC     Branch if No Carry

1677xx            BRA     Branch

Stack Advanced Compound Mode

On the other hand, if compactness in the representation of programs is desirable, while the 16-bit scratchpad operations help to provide this compactness, the ultimate in compactness is to be found by including up to three operations in each 16-bit halfword through a stack mode.

This mode, however, does have the liability in high-performance implementations that successive operations usually will depend on the preceding operation. This means that multiple concurrent threads will be required to avoid waste of computing resources in a pipelined implementation.

The format of instructions in this mode is depicted below:

The stack operations in this mode have the following opcodes:

00000        NOP    no operation
00001 00nnn  TYPE   switch to operating on values of type nnn:

                    000 byte         100 medium
                    001 halfword     101 floating
                    010 integer      110 double
                    011 long         111 quad

00010        DUP    append an extra copy of the current top item
                    on the stack to the top of the stack
00011        DROP   discard the top item on the stack
00100        ADD    replace the top two items on the stack with
                    one item containing their sum
00101        SUB
00110        MUL
00111        DIV
01000        AND ADDU  AND for fixed-point values, unnormalized ADD for
                       floating-point ones
01001        OR  SUBU
01010        XOR MULU
01011            DIVU

01100        SWAP   exchange the top two items on the stack
01101        ROT    

11110 0nnn0  PUSHR  append the value in register nnn to the top of
                    the stack

11110 1bbba aaaaa aaaaa aaaaa
             PUSH   append the value in memory location aaaaaaaaaaaaaaaa
                    plus the contents of base register bbb to the top of
                    the stack

11110 0bbb1 0xxxa aaaaa aaaaa aaaaa 
             PUSH   append the value in memory location aaaaaaaaaaaaaaaa
                    plus the contents of base register bbb plus the contents
                    of arithmetic-index register xxx to the top of the stack

11111 0nnn0  POPR   remove the top item on the stack, and place it
                    in register nnn

11111 1bbba aaaaa aaaaa aaaaa
             POP    remove the top item on the stack, and place it in memory
                    location aaaaaaaaaaaaaaaa plus the contents of base register
                    bbb

11111 0bbb1 0xxxa aaaaa aaaaa aaaaa 
             POP    remove the top item on the stack, and place it in memory
                    location aaaaaaaaaaaaaaaa plus the contents of base register
                    bbb plus the contents of arithmetic-index register xxx

In this mode, there are only two stacks; one for integers and one for floating-point numbers, in the appropriate set of supplementary registers. Base register zero contains the six-bit pointer for each, as a number equal to 256 times the fixed-point pointer value plus the floating-point pointer value.

Large Array Mode

Aside from the fact that the field used to specify an index register usually contains only a zero, indicating that indexing is not selected, another problem with normal mode is that if a program deals with several arrays larger than 64 kilobytes in size, even if the same base register used to access one such array can also access some shorter items ahead of it, each base register can point to at most one large array.

This addressing mode attempts to deal with both of these problems, and thus the full opcode instructions, which in the other modes remain similar to normal mode, are also changed. Here, when indexing is used, a base register is not needed, because a full absolute 32-bit address is used to point to the array. However, general registers 4 through 7 can also be used as index registers for conventional indexed access within the domains of base registers as well.

This provides room for scratchpad instructions referencing the supplementary registers, but always having register 0 as their destination, as 16-bit normal opcode instructions as well.

Pointer Page Mode

Large Array Mode deals with the problem of allowing a program to refer to more than eight local arrays larger than 64 kilobytes in size at one time. However, it does not address handling more than eight large arrays at once where the addresses of these arrays are not constant, but are instead passed to a subroutine as parameters.

Pointer Page Mode, with instruction formats as illustrated below:

omits the 16-bit instructions that perform operations between a register and a supplementary register, to free up opcode space for addressing modes that do deal with this issue.

Registers 1 through 7 of the set of eight scratchpad registers are each used to point to an expanse of memory containing 4,096 address constants. Thus, the address displacements in Pointer Page and Pointer Page Post-Indexed formats are in units of 32 bits (or 64 bits, if 64-bit addressing is enabled). An instruction in Pointer Page format allows a pointer to be accessed; an instruction in Pointer Page Post-Indexed format uses the pointer to indicate the starting point of an array, the contents of which are accessed by a byte displacement in the general register from 1 through 7 indicated as that instruction's index register.

Scratchpad register 0, except for its least significant 15 bits, is used to indicate a 32 kilobyte area of memory, aligned on a 32 kilobyte boundary, which is native to the current program segment. Own Page and Own Page Indexed format instructions therefore allow relocatable programs whose relocatability is limited to even 32 kilobyte boundaries to perform memory reference instructions without the additional overhead of adding a base register address, since instead only the concatenation of bits is required.

Short Memory Reference Mode

This mode attempts to approach the efficiency, as regards code density, of minicomputer architectures.

Using a six bit opcode field, which allows 8, 16, and 32 bit integer types and 32 and 64 bit floating-point types with the most common operations, and the destination register fixed at register zero, enough space is left in a 16-bit instruction word to indicate an address within a 512-byte memory area. This is the short memory reference type of instruction.

Base register zero (not scratchpad register zero, despite the use of the scratchpad registers as base registers with the basic types of memory-reference instructions in this mode) is used to point to this area.

For the other basic memory-reference instructions, the opcode field is seven bits in length, with its contents unrestricted. This allows the use of the unnormalized floating-point instructions without increasing the length of the instruction.

However, the remaining opcode space is somewhat constrained. The register-to-register instructions are not affected adversely by this.

But in the case of memory-reference instructions, the area of memory pointed to by the contents of any of base registers 1 through 7 is reduced to 32 K bytes from 64 K bytes compared with most addressing modes. In addition, a choice has to be made between specifying the destination register of a memory-reference instruction, or assuming the destination register to be register zero in order to allow indexing. As a result, the scratchpad registers are used as base registers with them rather than the normal base registers.

Also, while general register zero is not used as an index register, and the normal base register zero is not used as a base register with the addressing modes involving them, scratchpad register zero, when indicated in these addressing modes, is also used as a base register rather than indicating absolute addressing.

The full opcode modes are similar to those with most of the other modes on this page, and, as their address fields are 16 bits in length, they, along with the operate instructions, use the normal base registers.

Due to the fact that the base register field and the address field are not contiguous in the normal-length memory-reference instructions, initially I hesitated in specifying a direct cache version of this mode, but I have relented.

Alternate Short Memory Reference Mode

The instruction formats in this mode have the form:

This mode is identical to Short Memory Reference Mode except that the normal-length indexed instructions now allow any of registers 0 to 3 to be the destination register; the index register must be one of arithmetic/index registers 4 through 7, and only scratchpad registers 0 through 3 may be used as base registers.

This mode also does not have a direct cache version; not only is the base register field not contiguous with the address field, but furthermore, it now varies in length depending on whether indexing is present.


[Next] [Up] [Previous] [Next Section]