DOKK Library

AAP: An Altruistic Processor - A reference Harvard architecture for embedded compiler development

Authors Edward Jones Jeremy Bennett Simon Cook

License CC-BY-SA-4.0

Plaintext
         AAP: An Altruistic Processor
         A reference Harvard architecture for
          embedded compiler development




Simon Cook
Jeremy Bennett
Edward Jones
Application Note 13. Issue 2.1
Publication date December 2015
Legal Notice
This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International
License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0.
This license means you are free to:
•     Share—copy and redistribute the material in any medium or format;
•    Adapt—remix, transform, and build upon the material;
for any purpose, even commercially.
The licensor cannot revoke these freedoms as long as you follow the license terms.
Under the following terms:
•    Attribution.—You must give appropriate credit, provide a link to the license, and
     indicate if changes were made. You may do so in any reasonable manner, but not in any
     way that suggests the licensor endorses you or your use.
•    ShareAlike—If you remix, transform, or build upon the material, you must distribute
     your contributions under the same license as the original.
•    No additional restrictions—You may not apply legal terms or technological measures
     that legally restrict others from doing anything the license permits.
•    Nothing in this license impairs or restricts the author's moral rights.
           Note
           You do not have to comply with the license for elements of the material in the public
           domain or where your use is permitted by an applicable exception or limitation.
           No warranties are given. The license may not give you all of the permissions
           necessary for your intended use. For example, other rights such as publicity,
           privacy, or moral rights may limit how you use the material.
Embecosm is the business name of Embecosm Limited, a private limited company registered
in England and Wales. Registration number 6577021.




ii                            Copyright © 2015 Embecosm Limited
Table of Contents
1. Introduction .................................................................................................................. 1
     1.1. Revision History .................................................................................................. 1
2. Architecture Description ................................................................................................ 3
     2.1. Basic architectural features ................................................................................ 3
     2.2. Event Handling ................................................................................................... 5
     2.3. NOP Behavior ....................................................................................................... 5
3. Instructions ................................................................................................................... 6
     3.1. Notation .............................................................................................................. 6
          3.1.1. Assembler Notation .................................................................................. 6
     3.2. Instruction Format ............................................................................................. 6
     3.3. Summary of Instructions .................................................................................... 8
          3.3.1. 16-bit Instructions of AAP ........................................................................ 8
          3.3.2. 32-bit Instructions of AAP ...................................................................... 10
     3.4. Detailed Descriptions of 16-bit ALU Instructions .............................................. 14
          3.4.1. NOP: No Operation ................................................................................. 14
          3.4.2. ADD: Unsigned Add ............................................................................... 14
          3.4.3. SUB: Unsigned Subtract ........................................................................ 14
          3.4.4. AND: Bitwise AND .................................................................................. 15
          3.4.5. OR: Bitwise OR ...................................................................................... 15
          3.4.6. XOR: Bitwise Exclusive OR .................................................................... 15
          3.4.7. ASR: Arithmetic Shift Right .................................................................... 16
          3.4.8. LSL: Logical Shift Left ............................................................................ 16
          3.4.9. LSR: Logical Shift Right ......................................................................... 17
          3.4.10. MOV: Move Register to Register ............................................................ 17
          3.4.11. ADDI: Unsigned Add Immediate ........................................................... 17
          3.4.12. SUBI: Unsigned Subtract Immediate .................................................... 18
          3.4.13. ASRI: Arithmetic Shift Right Immediate ................................................ 18
          3.4.14. LSLI: Logical Shift Left Immediate ........................................................ 19
          3.4.15. LSRI: Logical Shift Right Immediate ..................................................... 19
          3.4.16. MOVI: Move Immediate to Register ....................................................... 20
     3.5. Detailed Descriptions of 16-bit Load/Store Instructions .................................... 20
          3.5.1. LDB: Indexed Load Byte ......................................................................... 20
          3.5.2. LDW: Indexed Load Word ....................................................................... 20
          3.5.3. LDB: Indexed Load Byte with Postincrement .......................................... 21
          3.5.4. LDW: Indexed Load Word with Postincrement ........................................ 21
          3.5.5. LDB: Indexed Load Byte with Predecrement ........................................... 22
          3.5.6. LDW: Indexed Load Word with Predecrement ......................................... 22
          3.5.7. STB: Indexed Store Byte ......................................................................... 23
          3.5.8. STW: Indexed Store Word ....................................................................... 23
          3.5.9. STB: Indexed Store Byte with Postincrement .......................................... 23
          3.5.10. STW: Indexed Store Word with Postincrement ...................................... 24
          3.5.11. STB: Indexed Store Byte with Predecrement ......................................... 24
          3.5.12. STW: Indexed Store Word with Predecrement ....................................... 25
     3.6. Detailed Descriptions of 16-bit Branch/Jump Instructions ............................... 25
          3.6.1. BRA: Relative Branch ............................................................................. 25
          3.6.2. BAL: Relative Branch and Link .............................................................. 26
          3.6.3. BEQ: Relative Branch if Equal ............................................................... 26
          3.6.4. BNE: Relative Branch if Not Equal ......................................................... 27
          3.6.5. BLTS: Relative Branch if Signed Less Than ............................................ 27
          3.6.6. BLES: Relative Branch if Signed Less Than or Equal To ......................... 28
          3.6.7. BLTU: Relative Branch if Unsigned Less Than ........................................ 28




iii                                       Copyright © 2015 Embecosm Limited
          3.6.8. BLEU: Relative Branch if Unsigned Less Than or Equal To ..................... 28
          3.6.9. JMP: Absolute Jump .............................................................................. 29
          3.6.10. JAL: Absolute Jump and Link .............................................................. 29
          3.6.11. JEQ: Absolute Jump if Equal ............................................................... 30
          3.6.12. JNE: Absolute Jump if Not Equal ......................................................... 30
          3.6.13. JLTS: Absolute Jump if Signed Less Than ............................................ 31
          3.6.14. JLES: Absolute Jump if Signed Less Than or Equal To ......................... 31
          3.6.15. JLTU: Absolute Jump if Unsigned Less Than ....................................... 31
          3.6.16. JLEU: Absolute Jump if Unsigned Less Than or Equal To ..................... 32
     3.7. Detailed Descriptions of 16-bit Miscellaneous Instructions ................................ 32
          3.7.1. RTE: Return from Exception .................................................................. 32
     3.8. Detailed Descriptions of 32-bit ALU Instructions .............................................. 33
          3.8.1. NOP: No Operation ................................................................................. 33
          3.8.2. ADD: Unsigned Add ............................................................................... 33
          3.8.3. SUB: Unsigned Subtract ........................................................................ 34
          3.8.4. AND: Bitwise AND .................................................................................. 34
          3.8.5. OR: Bitwise OR ...................................................................................... 34
          3.8.6. XOR: Bitwise Exclusive OR .................................................................... 35
          3.8.7. ASR: Arithmetic Shift Right .................................................................... 35
          3.8.8. LSL: Logical Shift Left ............................................................................ 36
          3.8.9. LSR: Logical Shift Right ......................................................................... 36
          3.8.10. MOV: Move Register to Register ............................................................ 37
          3.8.11. ADDI: Unsigned Add Immediate ........................................................... 37
          3.8.12. SUBI: Unsigned Subtract Immediate .................................................... 37
          3.8.13. ASRI: Arithmetic Shift Right Immediate ................................................ 38
          3.8.14. LSLI: Logical Shift Left Immediate ........................................................ 38
          3.8.15. LSRI: Logical Shift Right Immediate ..................................................... 39
          3.8.16. MOVI: Move Immediate to Register ....................................................... 39
          3.8.17. ADDC: Unsigned Add with Carry .......................................................... 40
          3.8.18. SUBC: Unsigned Subtract with Carry ................................................... 40
          3.8.19. ANDI: Bitwise AND Immediate .............................................................. 41
          3.8.20. ORI: Bitwise OR immediate .................................................................. 41
          3.8.21. XORI: Bitwise Exclusive OR Immediate ................................................ 41
     3.9. Detailed Descriptions of 32-bit Load/Store Instructions .................................... 42
          3.9.1. LDB: Indexed Load Byte ......................................................................... 42
          3.9.2. LDW: Indexed Load Word ....................................................................... 42
          3.9.3. LDB: Indexed Load Byte with Postincrement .......................................... 43
          3.9.4. LDW: Indexed Load Word with Postincrement ........................................ 43
          3.9.5. LDB: Indexed Load Byte with Predecrement ........................................... 44
          3.9.6. LDW: Indexed Load Word with Predecrement ......................................... 44
          3.9.7. STB: Indexed Store Byte ......................................................................... 44
          3.9.8. STW: Indexed Store Word ....................................................................... 45
          3.9.9. STB: Indexed Store Byte with Postincrement .......................................... 45
          3.9.10. STW: Indexed Store Word with Postincrement ...................................... 46
          3.9.11. STB: Indexed Store Byte with Predecrement ......................................... 46
          3.9.12. STW: Indexed Store Word with Predecrement ....................................... 47
     3.10. Detailed Descriptions of 32-bit Branch/Jump Instructions ............................. 47
          3.10.1. BRA: Relative Branch ........................................................................... 47
          3.10.2. BAL: Relative Branch and Link ............................................................ 48
          3.10.3. BEQ: Relative Branch if Equal ............................................................. 48
          3.10.4. BNE: Relative Branch if Not Equal ....................................................... 49
          3.10.5. BLTS: Relative Branch if Signed Less Than .......................................... 49
          3.10.6. BLES: Relative Branch if Signed Less Than or Equal To ........................ 50



iv                                   Copyright © 2015 Embecosm Limited
           3.10.7. BLTU: Relative Branch if Unsigned Less Than ...................................... 50
           3.10.8. BLEU: Relative Branch if Unsigned Less Than or Equal To ................... 51
           3.10.9. JMP: Absolute Jump ............................................................................ 51
           3.10.10. JAL: Absolute Jump and Link ............................................................ 52
           3.10.11. JEQ: Absolute Jump if Equal ............................................................. 52
           3.10.12. JNE: Absolute Jump if Not Equal ....................................................... 52
           3.10.13. JLTS: Absolute Jump if Signed Less Than .......................................... 53
           3.10.14. JLES: Absolute Jump if Signed Less Than or Equal To ....................... 53
           3.10.15. JLTU: Absolute Jump if Unsigned Less Than ...................................... 54
           3.10.16. JLEU: Absolute Jump if Unsigned Less Than or Equal To ................... 54
           3.10.17. JMPL: Absolute Jump Long ................................................................ 55
           3.10.18. JALL: Absolute Jump Long and Link .................................................. 55
           3.10.19. JEQL: Absolute Jump Long if Equal ................................................... 56
           3.10.20. JNEL: Absolute Jump Long if Not Equal ............................................. 56
           3.10.21. JLTSL: Absolute Jump Long if Signed Less Than ................................ 57
           3.10.22. JLESL: Absolute Jump Long if Signed Less Than or Equal To ............. 57
           3.10.23. JLTUL: Absolute Jump Long if Unsigned Less Than ........................... 58
           3.10.24. JLEUL: Absolute Jump Long if Unsigned Less Than or Equal To ......... 58
    3.11. Detailed Descriptions of 32-bit Miscellaneous Instructions .............................. 59
4. ABI .............................................................................................................................. 60
    4.1. Defined Registers .............................................................................................. 60
    4.2. Calling Convention ............................................................................................ 60




v                                          Copyright © 2015 Embecosm Limited
List of Figures
2.1. AAP architecture ........................................................................................................ 3
3.1. AAP 16-bit instruction formats. .................................................................................. 7
3.2. AAP 32-bit instruction formats. .................................................................................. 8




vi                                      Copyright © 2015 Embecosm Limited
List of Tables
3.1.   16-bit ALU instructions .............................................................................................. 8
3.2.   16-bit load/store instructions .................................................................................... 9
3.3.   16-bit branch/jump instructions ............................................................................... 9
3.4.   Miscellaneous 16-bit instructions ............................................................................. 10
3.5.   32-bit ALU instructions ............................................................................................ 10
3.6.   32-bit load/store instructions .................................................................................. 11
3.7.   32-bit branch/jump instructions .............................................................................. 12




vii                                     Copyright © 2015 Embecosm Limited
Chapter 1. Introduction
AAP is a Harvard architecture specification designed for experimenting with various features
in compiler back ends. In particular it has features that are common within small deeply
embedded systems, such as a dearth of registers, word address code memory and pointers
that will not fit in an integer.
It is also designed to be easy to use in demonstrations and education/training. This includes
hardware and simulator implementation as well as the tool chain and library implementation.
The design is based on no processor in particular, although as an open hardware design, it is
inspired by the OpenRISC and RISC-V projects. There are features drawn from a wide range
of processors developed over the past 30 years. Indeed the branch-and-link operation goes
back even further, to the IBM 360.

1.1. Revision History
Revision History
Revision 2.1                 10 December 2015             Edward Jones
The Postincrement and Predecrement store instructions defined Ra rather than Rd as the
operand to which the update was applied.
Postincrement, Predecement instructions now increment or decrement by the amount of the
provided offset (Previously it was a fixed offset of one or two bytes for byte and word operations
respectively).
BGTS, BGTU, JGTS, JGTU, JGTSL, JGTUL. These instructions have been replaced with branches
with a 'Less Than or Equal To' condition. The new instructions are BLES, BLEU, JLES, JLEU,
JLESL, JLEUL.
Revision 2.0                    9 October 2015                 Jeremy Bennett
Issue 2.0, which covers the entire ISA.
Revision 1.9                    8 October 2015                 Jeremy Bennett
Final draft before release 2.0. Adds some notation description and a chapter for the
architecture description, which incorporates some of the old intro and the old chapter on NOP
side effects.
Revision 1.8                    8 October 2015                 Jeremy Bennett
All 32-bit instructions described.
Revision 1.7                    8 September 2015               Jeremy Bennett
First batch of 32-bit ALU instruction described. Various typos fixed.
Revision 1.6                    8 September 2015               Jeremy Bennett
All 16-bit instructions described. Encoding of JAL corrected in the summary. Rb used to store
the PC for all BAL and JAL instructions.
Revision 1.5                    8 September 2015               Jeremy Bennett
16-bit ALU instruction details complete. Change opcode mnemonics for ALU instructions with
constant arguments. Off-by-one encoding for immediate shift values described.
Revision 1.4                    4 September 2015               Jeremy Bennett
Structure of detailed instruction descriptions refined. Most 16-bit ALU instructions now
documented.
Revision 1.3                    4 September 2015               Jeremy Bennett
All instruction formats now shown. All summaries in new format.
Revision 1.2                    3 September 2015               Jeremy Bennett
First stage of improved formatting, using LibreOffice Impress to as the basis of the instruction
format diagrams for 32-bit instructions (generating SVG and PNG). Clearer summary of
instructions used for 32-bit ALU instructions.



1                              Copyright © 2015 Embecosm Limited
Revision 1.1                     18 July 2015                  Jeremy Bennett
Start of revision process. Remove load/store double instructions. Use second opcode field of
32-bit load/store as extra constant field. Make all load/store offsets signed. Make BAL use Rb
rather than Ra to keep constant field contiguous.
Revision 1.0                     14 April 2015                 Jeremy Bennett
Bump release number to 1.0 for issue.
Revision 0.9                     14 April 2015                 Jeremy Bennett
First public release outlining the architecture.
Revision N/A                     11 April 2015                 Jeremy Bennett
Correct encoding of 32-bit branches (4 more bits of offset). Correct NOP constant meanings.
Matches server/simulator commit b179463.
Revision N/A                     8 April 2015                  Jeremy Bennett
Full summary of all 16-bit and 32-bit instructions.
Revision N/A                     8 April 2015                  Jeremy Bennett
Updated preface in preparation for revised architecture.
Revision N/A                     6 April 2015                  Simon Cook
Initial concept




2                            Copyright © 2015 Embecosm Limited
Chapter 2. Architecture Description
Figure 2.1 shows the overall structure of AAP.


                                                                       Code Memories(words)
                4 - 64 Registers
         R0                                               0 x FFFFFF

         R3
         R4




         R6 3                                               0x0000

                STATUS/PC                                              Data Memories (bytes)
                                                            0 x FFFF




                        ALU

                                                            0x0000


Figure 2.1. AAP architecture

2.1. Basic architectural features
These are the key features of the AAP design.

16-bit RISC                 The core design sticks to the RISC principles of 3-address register-
architecture                to-register operation, a small number of operations and a simple to
                            implement data path. The fundamental data type is the 16-bit integer.

Configurable number         Although 32/64-bit RISC architectures typically have 16 or more
of registers                general purpose registers, small deeply embedded processors often
                            have far fewer. This represents a significant compiler implementation
                            challenge. To allow exploration of this area, AAP can be configured
                            with between 4 and 64 16-bit registers.

Harvard memory              The basic architecture provides a 64k byte addressed data memory
layout                      and a separate 16M word instruction memory. By requiring more
                            than 16-bits to address the instruction memory, the compiler writer
                            can explore the challenge of pointers which are larger than the native
                            integer type.
                            Deeply embedded systems often have very small memories,
                            particularly for data, so the size of memories can be configured.



3                                  Copyright © 2015 Embecosm Limited
                        Many architectures also provide more than two address spaces, often
                        for special purposes. For example a small EEPROM alongside Flash
                        memory, or the Special Purpose Register block of OpenRISC. AAP
                        can support additional address spaces, allowing support for multiple
                        address spaces throughout the tool chain to be explored.

24-bit program          AAP requires a 24-bit program counter, which is held in a 32-bit
counter with 8-bit      register. The top bits of the program counter then form a status
status register         register. Jump instructions ignore these top 8 bits.
                        At present only one status bit is defined, a carry flag to allow multiple
                        precision arithmetic.

16/32-bit               A frequent feature of many architectures is to provide a subset of the
instruction encoding    most commonly used parts of the Instruction Set Architecture (ISA)
                        in a short encoding of 16-bits. Less common instructions are then
                        encoded in 32-bits.
                        Optimizing to use these shorter instructions, is particularly
                        important for compilers for embedded targets, where memory is at a
                        premium. AAP provides such a 16-bit subset with a 32-bit encoding
                        of the full ISA. However it follows the instruction chaining of RISC-V,
                        so even longer instructions could be created in the future.

                        The fields within each 16-bit instruction are fixed. A 32-bit
                        instruction pairs up those fields to increase the number of
                        instructions.

3-address code          AAP has stuck rigidly to the RISC principle of 3-address instructions
                        throughout. Almost all instructions come in two variants, one where
                        the third argument is a register, and one where the third argument
                        is a constant.

No flags for flow of    There are no flag registers indicating the results of operations for use
control                 in conditional jumps. Instead the operation is encoded within the
                        jump instruction itself.
                        There is an 8-bit status register as part of the program counter, which
                        includes a carry flag. However this is not used for flow-of-control, but
                        to enable multiple precision arithmetic.

Little endian           The architecture is little-endian—the least significant byte of a word
                        or double word is at the lowest address.
                        The behavior for instruction memory is that one word is fetched, since
                        it may be a 16-bit instruction. If a second word is needed, then its
                        fields are paired with the first instructions to give larger values for
                        each field. This is done in little-endian fashion, i.e. the field from the
                        second instruction forms the most significant bits of the combined
                        field.

No delay slots          Early RISC designs introduced the concept of a delay slot after
                        branches. This avoided pipeline delays in branch processing.
                        Implementations can now avoid such pipeline delay, so like most
                        modern architectures, AAP does not have delay slots.

NOP with argument       This idea is taken from OpenRISC. The NOP opcode includes fields to
for simulator control   specify a register and a constant. These can be used in both hardware
                        and simulation to trigger side-effects.



4                            Copyright © 2015 Embecosm Limited
2.2. Event Handling
Events indirect through instructions in the first 256 (0x100) words of instruction memory.
In general these should be 32-bit branch instructions, which means event handlers should
reside in first or last 221 words of instruction memory.
At present the following event vector locations (word addresses) are defined
0x00     Power-on reset.
0x02     Bus error
The event handling mechanism is still in development. In particular no location is yet defined
for the return address to be used by the RTE instruction (see Section 3.7.1).

2.3. NOP Behavior
The NOP instruction takes an immediate argument which can be used to trigger certain
behavior in a simulator.
•      0 : Breakpoint
•      1 : Do nothing
•      2 : Exit with return code in Rd
•      3 : Write char in Rd to standard output.
•      4 : Write char in Rd to standard error.
•      All other values: do nothing, but future behavior not guaranteed.




5                              Copyright © 2015 Embecosm Limited
Chapter 3. Instructions
3.1. Notation
In the instruction descriptions below, the following notation is used.

Rd                    Destination register number "d" in the general registers.

Ra                    First source register number "a" in the general registers.

Rb                    Second source register number "b" in the general registers.

PC                    The program counter

I                     Unsigned immediate value

S                     Signed immediate value

dmem[i]               Byte offset "i" in the data memory.

imem[i]               Word offset "i" in the code memory.

carry                 The carry flag.

SignExt(x)            The value "x" (which may be one of the above) sign extended as necessary.

Individual bits in the encodings are used as follows.

0    A zero bit.

1    A one bit.

dn Bit "n" of the destination register field.

an Bit "n" of the the first source register field.

bn Bit "n" of the the second source register field.

in   Bit "n" of the the unsigned constant field.

sn Bit "n" of the the signed constant field.

3.1.1. Assembler Notation
The assembler generally follows standard GNU assembler conventions. Instructions take the
following form:

        [label:] opcode [arguments]

There may be up to 3 arguments, separated by commas. Registers are indicted by R followed
by a number. Constants and constant expressions may be preceded by # for clarity, but this
is not required. C style notation to indicate the base of constants, which defaults to decimal.

3.2. Instruction Format
The 16-bit instruction formats are shown in Figure 3.1 and the 32-bit instruction formats in
Figure 3.2.



6                              Copyright © 2015 Embecosm Limited
     Format

       1    0 c1 c0 o3 o2 o1 o0 d2 d1 d0 a2 a1 a0 b2 b1 b0


       2    0 c1 c0 o3 o2 o1 o0 d2 d1 d0 a2 a1 a0 i2 i1 i0


       3    0 c1 c0 o3 o2 o1 o0 s2 s1 s0 a2 a1 a0 b2 b1 b0


       4    0 c1 c0 o3 o2 o1 o0 d2 d1 d0 a2 a1 a0 s2 s1 s0


       5    0 c 1 c 0 o 3 o 2 o 1 o 0 d2 d1 d0 i 5 i 4 i 3 i 2 i 1 i 0


       6    0 c 1 c 0 o 3 o 2 o 1 o 0 s 5 s 4 s 3 s 2 s 1 s 0 b2 b1 b0


       7    0 c1 c0 o 3 o 2 o 1 o 0 s8 s7 s6 s5 s4 s3 s2 s1 s0

           c 1c 0         Opcode class                                   b2...b0   Second source register
           o3...o0        Opcode                                         in...i0   Unsigned immediate
           d2...d0        Destination register                           sn...s0   Unsigned immediate
           a2...a0        First source register

Figure 3.1. AAP 16-bit instruction formats.




7                                     Copyright © 2015 Embecosm Limited
      Format        First word (low address)                    Second word (high address)

        8     1 c1 c0 o3 o2 o1 o0 d2 d1 d0 a2 a1 a0 b2 b1 b0 0 c3 c2 o7 o6 o5 o4 d5 d4 d3 a5 a4 a3 b5 b4 b3


        9     1 c1 c0 o3 o2 o1 o0 d2 d1 d0 a2 a1 a0 i2 i1 i0 0 c3 c2 o6 o5 o4 0 d5 d4 d3 a5 a4 a3 i5 i4 i3


      10      1 c1 c0 o3 o2 o1 o0 d2 d1 d0 a2 a1 a0 i2 i1 i0 0 c3 c2 i8 i7 i6 1 d5 d4 d3 a5 a4 a3 i5 i4 i3


      11      1 c1 c0 o3 o2 o1 o0 d2 d1 d0 a2 a1 a0 i2 i1 i0 0 c3 c2 i9 i8 i7 i6 d5 d4 d3 a5 a4 a3 i5 i4 i3


      12      1 c1 c0 o3 o2 o1 o0 s2 s1 s0 a2 a1 a0 b2 b1 b0 0 c3 c2 s9 s8 s7 s6 s5 s4 s3 a5 a4 a3 b5 b4 b3


      13      1 c1 c0 o3 o2 o1 o0 d2 d1 d0 a2 a1 a0 s2 s1 s0 0 c3 c2 s9 s8 s7 s6 d5 d4 d3 a5 a4 a3 s5 s4 s3


      14      1 c1 c0 o3 o2 o1 o0 d2 d1 d0 i5 i4 i3 i2 i1 i0 0 c3 c2 o7 o6 o5 o4 d5 d4 d3i11i10 i9 i8 i7 i6


      15      1 c1 c0 o3 o2 o1 o0 d2 d1 d0 i5 i4 i3 i2 i1 i0 0 c3 c2 i15i14i13i12d5 d4 d3i11i10 i9 i8 i7 i6


      16      1 c1 c0 o3 o2 o1 o0 s5 s4 s3 s2 s1 s0 b2 b1 b0 0 c3 c2s15s14s13s12s11s10s9 s8 s7 s6 b5 b4 b3


      17      1 c1 c0 o3 o2 o1 o0 s8 s7 s6 s5 s4 s3 s2 s1 s0 0 c3 c2s21s20s19s18s17s16s15s14s13s12s11s10s9

              c3...c0    Opcode class                       b5...b0     Second source register
              on...o0    Opcode                             in...i0     Unsigned immediate
              d5...d0    Destination register               sn...s0     Unsigned immediate
              a5...a0    First source register
Figure 3.2. AAP 32-bit instruction formats.
Longer instruction formats are possible by setting the top bit of the second word to 1. By
repeating this, instructions of arbitrary length are possible.

3.3. Summary of Instructions

3.3.1. 16-bit Instructions of AAP
•     Table 3.1 lists all the 16-bit ALU instructions, which have class 00;
•     Table 3.2 lists all the 16-bit load/store instructions, which have class 01;
•     Table 3.3 lists all the 16-bit branch/jump instructions, which have class 10; and
•     Table 3.4 lists all the 16-bit miscellaneous instructions, which have class 11.

Opcode                   Format            Encoding            Description
NOP    Rd,I                  5        0000000dddiiiiii No operation



8                                 Copyright © 2015 Embecosm Limited
Opcode              Format           Encoding     Description
ADD    Rd,Ra,Rb        1      0000001dddaaabbb Unsigned add
SUB    Rd,Ra,Rb        1      0000010dddaaabbb Unsigned subtract
AND    Rd,Ra,Rb        1      0000011dddaaabbb Bitwise AND
OR     Rd,Ra,Rb        1      0000100dddaaabbb Bitwise OR
XOR    Rd,Ra,Rb        1      0000101dddaaabbb Bitwise exclusive OR
ASR    Rd,Ra,Rb        1      0000110dddaaabbb Arithmetic shift right
LSL    Rd,Ra,Rb        1      0000111dddaaabbb Logical shift left
LSR    Rd,Ra,Rb        1      0001000dddaaabbb Logical shift right
MOV    Rd,Ra           1      0001001dddaaa000 Move register to register
ADDI    Rd,Ra,#I       2      0001010dddaaaiii Unsigned add immediate
SUBI    Rd,Ra,#I       2      0001011dddaaaiii Unsigned subtract immediate
ASRI    Rd,Ra,#I       2      0001100dddaaaiii Arithmetic shift right immediate
LSLI    Rd,Ra,#I       2      0001101dddaaaiii Logical shift left immediate
LSRI    Rd,Ra,#I       2      0001110dddaaaiii Logical shift right immediate
MOVI    Rd,#I          5      0001111dddiiiiii Move immediate to register
Table 3.1. 16-bit ALU instructions

Opcode              Format           Encoding     Description
LDB    Rd,(Ra,S)       4      0010000dddaaasss Indexed load byte
LDW    Rd,(Ra,S)       4      0010100dddaaasss Indexed load word
LDB    Rd,(Ra+,S)      4      0010001dddaaasss Indexed load byte with postincrement
LDW    Rd,(Ra+,S)      4      0010101dddaaasss Indexed load word with postincrement
LDB    Rd,(-Ra,S)      4      0010010dddaaasss Indexed load byte with predecrement
LDW    Rd,(-Ra,S)      4      0010110dddaaasss Indexed load word with predecrement
STB    (Rd,S),Ra       4      0011000dddaaasss Indexed store byte
STW    (Rd,S),Ra       4      0011100dddaaasss Indexed store word
STB    (Rd+,S),Ra      4      0011001dddaaasss Indexed store byte with postincrement
STW    (Rd+,S),Ra      4      0011101dddaaasss Indexed store word with postincrement
STB    (-Rd,S),Ra      4      0011010dddaaasss Indexed store byte with predecrement
STW    (-Rd,S),Ra      4      0011110dddaaasss Indexed store word with predecrement
Table 3.2. 16-bit load/store instructions

Opcode              Format           Encoding     Description
BRA    S               7      0100000sssssssss Relative branch
BAL    S,Rb            6      0100001ssssssbbb Relative branch and link
BEQ    S,Ra,Rb         3      0100010sssaaabbb Relative branch if equal
BNE    S,Ra,Rb         3      0100011sssaaabbb Relative branch if not equal
BLTS S,Ra,Rb           3      0100100sssaaabbb Relative branch if signed less than



9                           Copyright © 2015 Embecosm Limited
Opcode                Format         Encoding        Description
                                                     Relative branch if signed less than or
BLES S,Ra,Rb              3      0100101sssaaabbb
                                                     equal to
BLTU S,Ra,Rb              3      0100110sssaaabbb Relative branch if unsigned less than
                                                     Relative branch if unsigned less than or
BLEU S,Ra,Rb              3      0100111sssaaabbb
                                                     equal to
JMP    Rd                 1      0101000ddd000000 Absolute jump
JAL    Rd,Rb              1      0101001ddd000bbb Absolute jump and link
JEQ    Rd,Ra,Rb           1      0101010dddaaabbb Absolute jump if equal
JNE    Rd,Ra,Rb           1      0101011dddaaabbb Absolute jump if not equal
JLTS Rd,Ra,Rb             1      0101100dddaaabbb Absolute jump if signed less than
                                                     Absolute jump if signed less than or
JLES Rd,Ra,Rb             1      0101101dddaaabbb
                                                     equal to
JLTU Rd,Ra,Rb             1      0101110dddaaabbb Absolute jump if unsigned less than
                                                     Absolute jump if unsigned less than or
JLEU Rd,Ra,Rb             1      0101111dddaaabbb
                                                     equal to
Table 3.3. 16-bit branch/jump instructions

Opcode                Format         Encoding        Description
RTE    Rd                 1      0110000ddd000000 Return from exception
Table 3.4. Miscellaneous 16-bit instructions

3.3.2. 32-bit Instructions of AAP
In the following list, the encoding is shown with the word at the lower address first.
•     Table 3.5 lists all the 32-bit ALU instructions, which have class 00xx;
•     Table 3.6 lists all the 32-bit load/store instructions, which have class 01xx;
•     Table 3.7 lists all the 32-bit branch/jump instructions, which have class 10xx; and
•     There are no 32-bit instructions in the miscellaneous class, but if there were, they would
      have have class 11xx.

Opcode                Format         Encoding        Description
                                 1000000dddiiiiii
NOP    Rd,I              14                          No operation
                                 0000000dddiiiiii
                                 1000001dddaaabbb
ADD    Rd,Ra,Rb           8                          Unsigned add
                                 0000000dddaaabbb
                                 1000010dddaaabbb
SUB    Rd,Ra,Rb           8                          Unsigned subtract
                                 0000000dddaaabbb
                                 1000011dddaaabbb
AND    Rd,Ra,Rb           8                          Bitwise AND
                                 0000000dddaaabbb
                                 1000100dddaaabbb
OR     Rd,Ra,Rb           8                          Bitwise OR
                                 0000000dddaaabbb



10                            Copyright © 2015 Embecosm Limited
Opcode              Format           Encoding     Description
                              1000101dddaaabbb
XOR    Rd,Ra,Rb        8                          Bitwise exclusive OR
                              0000000dddaaabbb
                              1000110dddaaabbb
ASR    Rd,Ra,Rb        8                          Arithmetic shift right
                              0000000dddaaabbb
                              1000111dddaaabbb
LSL    Rd,Ra,Rb        8                          Logical shift left
                              0000000dddaaabbb
                              1001000dddaaabbb
LSR    Rd,Ra,Rb        8                          Logical shift right
                              0000000dddaaabbb
                              1001001dddaaa000
MOV    Rd,Ra           8                          Move register to register
                              0000000dddaaa000
                              1001010dddaaaiii
ADDI   Rd,Ra,I         11                         Unsigned add immediate
                              000iiiidddaaaiii
                              1001011dddaaaiii
SUBI   Rd,Ra,I         11                         Unsigned subtract immediate
                              000iiiidddaaaiii
                              1001100dddaaaiii
ASRI   Rd,Ra,I         9                          Arithmetic shift right immediate
                              0000000dddaaaiii
                              1001101dddaaaiii
LSLI   Rd,Ra,I         9                          Logical shift left immediate
                              0000000dddaaaiii
                              1001110dddaaaiii
LSRI   Rd,Ra,I         9                          Logical shift right immediate
                              0000000dddaaaiii
                              1001111dddiiiiii
MOVI   Rd,I            15                         Move immediate to register
                              000iiiidddiiiiii
                              1000001dddaaabbb
ADDC Rd,Ra,Rb          8                          Add with carry
                              0000001dddaaabbb
                              1000010dddaaabbb
SUBC Rd,Ra,Rb          8                          Subtract with carry
                              0000001dddaaabbb
                              1000011dddaaaiii
ANDI   Rd,Ra,I         10                         Bitwise AND immediate
                              000iii1dddaaaiii
                              1000100dddaaaiii
ORI    Rd,Ra,I         10                         Bitwise OR immediate
                              000iii1dddaaaiii
                              1000101dddaaaiii
XORI   Rd,Ra,I         10                         Bitwise exclusive OR immediate
                              000iii1dddaaaiii

Table 3.5. 32-bit ALU instructions

Opcode              Format           Encoding     Description
                              1010000dddaaasss
LDB    Rd,(Ra,S)       13                         Indexed load byte
                              000ssssdddaaasss




11                          Copyright © 2015 Embecosm Limited
Opcode              Format        Encoding        Description
                              1010100dddaaasss
LDW   Rd,(Ra,S)        13                         Indexed load word
                              000ssssdddaaasss
                              1010001dddaaasss
LDB   Rd,(Ra+,S)       13                         Indexed load byte with postincrement
                              000ssssdddaaasss
                              1010101dddaaasss
LDW   Rd,(Ra+,S)       13                         Indexed load word with postincrement
                              000ssssdddaaasss
                              1010010dddaaasss
LDB   Rd,(-Ra,S)       13                         Indexed load byte with predecrement
                              000ssssdddaaasss
                              1010110dddaaasss
LDW   Rd,(-Ra,S)       13                         Indexed load word with predecrement
                              000ssssdddaaasss
                              1011000dddaaasss
STB   (Rd,S),Ra        13                         Indexed store byte
                              000ssssdddaaasss
                              1011100dddaaasss
STW   (Rd,S),Ra        13                         Indexed store word
                              000ssssdddaaasss
                              1011001dddaaasss
STB   (Rd+,S),Ra       13                         Indexed store byte with postincrement
                              000ssssdddaaasss
                              1011101dddaaasss
STW   (Rd+,S),Ra       13                         Indexed store word with postincrement
                              000ssssdddaaasss
                              1011010dddaaasss
STB   (-Rd,S),Ra       13                         Indexed store byte with predecrement
                              000ssssdddaaasss
                              1011111dddaaasss
STW   (-Rd,S),Ra       13                         Indexed store word with predecrement
                              000ssssdddaaasss

Table 3.6. 32-bit load/store instructions

Opcode              Format        Encoding        Description
                              1100000sssssssss
BRA   S                17                         Relative branch
                              000sssssssssssss
                              1100001ssssssbbb
BAL   S,Rb             16                         Relative branch and link
                              000ssssssssssbbb
                              1100010sssaaabbb
BEQ   S,Ra,Rb          12                         Relative branch if equal
                              000sssssssaaabbb
                              1100011sssaaabbb
BNE   S,Ra,Rb          12                         Relative branch if not equal
                              000sssssssaaabbb
                              1100100sssaaabbb
BLTS S,Ra,Rb           12                         Relative branch if signed less than
                              000sssssssaaabbb
                              1100101sssaaabbb Relative branch if signed less than or
BLES S,Ra,Rb           12
                              000sssssssaaabbb equal to




12                          Copyright © 2015 Embecosm Limited
Opcode              Format       Encoding        Description
                             1100110sssaaabbb
BLTU S,Ra,Rb          12                         Relative branch if unsigned less than
                             000sssssssaaabbb
                             1100111sssaaabbb Relative branch if unsigned less than or
BLEU S,Ra,Rb          12
                             000sssssssaaabbb equal to
                             1101000ddd000000
JMP   Rd               8                         Absolute jump
                             0000000ddd000000
                             1101001ddd000bbb
JAL   Rd,Rb            8                         Absolute jump and link
                             0000000ddd000bbb
                             1101010dddaaabbb
JEQ   Rd,Ra,Rb         8                         Absolute jump if equal
                             0000000dddaaabbb
                             1101011dddaaabbb
JNE   Rd,Ra,Rb         8                         Absolute jump if not equal
                             0000000dddaaabbb
                             1101100dddaaabbb
JLTS Rd,Ra,Rb          8                         Absolute jump if signed less than
                             0000000dddaaabbb
                             1101101dddaaabbb Absolute jump if signed less than or
JLES Rd,Ra,Rb          8
                             0000000dddaaabbb equal to
                             1101110dddaaabbb
JLTU Rd,Ra,Rb          8                         Absolute jump if unsigned less than
                             0000000dddaaabbb
                             1101111dddaaabbb Absolute jump if unsigned less than or
JLEU Rd,Ra,Rb          8
                             0000000dddaaabbb equal to
                             1101000ddd000000
JMPL Rd                8                         Absolute jump long
                             0000001ddd000000
                             1101001ddd000bbb
JALL Rd,Rb             8                         Absolute jump long and link
                             0000001ddd000bbb
                             1101010dddaaabbb
JEQL Rd,Ra,Rb          8                         Absolute jump long if equal
                             0000001dddaaabbb
                             1101011dddaaabbb
JNEL Rd,Ra,Rb          8                         Absolute jump long if not equal
                             0000001dddaaabbb
                             1101100dddaaabbb
JLTSL Rd,Ra,Rb         8                         Absolute jump long if signed less than
                             0000001dddaaabbb
                             1101101dddaaabbb Absolute jump long if signed less than
JLESL Rd,Ra,Rb         8
                             0000001dddaaabbb or equal to
                             1101110dddaaabbb Absolute jump long if unsigned less
JLTUL Rd,Ra,Rb         8
                             0000001dddaaabbb than
                             1101111dddaaabbb Absolute jump long if unsigned less
JLEUL Rd,Ra,Rb         8
                             0000001dddaaabbb than or equal to
Table 3.7. 32-bit branch/jump instructions



13                         Copyright © 2015 Embecosm Limited
3.4. Detailed Descriptions of 16-bit ALU Instructions

3.4.1. NOP: No Operation
Encoding (format 5):

 0   0    0   0   0   0   0   d 2 d 1 d 0 i5   i4   i3   i2   i1   i0

Syntax:
     NOP Rd,I
Constraints:
     d≤7
     I ≤ 63
Outcome:
     PC ← PC + 1
Notes:
     This opcode may trigger side-effects in implementations, depending on the value of I,
     particularly when simulating (see Section 2.3).
     All implementations should use d = 0, I = 0 as the break instruction for debugging, which
     should halt the processor.
     All implementations should use d = 0, I = 1 as a true no-operation instruction.
     The rationale behind this decision is that in an erroneous program, the most likely value
     to be encountered as a random instruction is zero, which will stop the processor.

3.4.2. ADD: Unsigned Add
Encoding (format 1):

 0   0    0   0   0   0   1   d2 d1 d0 a2 a1 a0 b2 b1 b0

Syntax:
     ADD Rd,Ra,Rb
Constraints:
     a≤7
     b≤7
     d≤7
Outcome:
     Rd ← R a + R b
     carry ← ( ( Ra + Rb ) ≥ 216 ) ? 1 : 0
     PC ← PC + 1

3.4.3. SUB: Unsigned Subtract
Encoding (format 1):

 0   0    0   0   0   1   0   d2 d1 d0 a2 a1 a0 b2 b1 b0

Syntax:



14                               Copyright © 2015 Embecosm Limited
     SUB Rd,Ra,Rb
Constraints:
     a≤7
     b≤7
     d≤7
Outcome:
     Rd ← Ra - Rb
     carry ← ( Rb > Ra ) ? 1 : 0
     PC ← PC + 1

3.4.4. AND: Bitwise AND
Encoding (format 1):

 0   0    0   0   0   1   1   d2 d1 d0 a2 a1 a0 b2 b1 b0

Syntax:
     AND Rd,Ra,Rb
Constraints:
     a≤7
     b≤7
     d≤7
Outcome:
     Rd ← Ra & Rb
     PC ← PC + 1

3.4.5. OR: Bitwise OR
Encoding (format 1):

 0   0    0   0   1   0   0   d2 d1 d0 a2 a1 a0 b2 b1 b0

Syntax:
     OR Rd,Ra,Rb
Constraints:
     a≤7
     b≤7
     d≤7
Outcome:
     Rd ← R a | R b
     PC ← PC + 1

3.4.6. XOR: Bitwise Exclusive OR
Encoding (format 1):



15                              Copyright © 2015 Embecosm Limited
 0   0    0   0   1   0   1   d2 d1 d0 a2 a1 a0 b2 b1 b0

Syntax:
     XOR Rd,Ra,Rb
Constraints:
     a≤7
     b≤7
     d≤7
Outcome:
     Rd ← R a ^ R b
     PC ← PC + 1

3.4.7. ASR: Arithmetic Shift Right
Encoding (format 1):

 0   0    0   0   1   1   0   d2 d1 d0 a2 a1 a0 b2 b1 b0

Syntax:
     ASR Rd,Ra,Rb
Constraints:
     a≤7
     b≤7
     d≤7
Outcome:
     Rd ← ( Ra | ( carry << 16 ) ) >> Rb )
     carry ← 0
     PC ← PC + 1
Notes:
     If Rb ≥ 17 the result in Rd will be zero.
     The carry flag is always cleared, even if a shift of zero is specified.

3.4.8. LSL: Logical Shift Left
Encoding (format 1):

 0   0    0   0   1   1   1   d2 d1 d0 a2 a1 a0 b2 b1 b0

Syntax:
     LSL Rd,Ra,Rb
Constraints:
     a≤7
     b≤7



16                               Copyright © 2015 Embecosm Limited
     d≤7
Outcome:
     Rd ← Ra << Rb
     PC ← PC + 1
Notes:
     If Rb ≥ 16 the result in Rd will be zero.

3.4.9. LSR: Logical Shift Right
Encoding (format 1):

 0   0    0   1   0   0   0   d2 d1 d0 a2 a1 a0 b2 b1 b0

Syntax:
     LSR Rd,Ra,Rb
Constraints:
     a≤7
     b≤7
     d≤7
Outcome:
     Rd ← Ra >> Rb
     PC ← PC + 1
Notes:
     If Rb ≥ 16 the result in Rd will be zero.

3.4.10. MOV: Move Register to Register
Encoding (format 1):

 0   0    0   1   0   0   1   d2 d1 d0 a2 a1 a0    0   0    0

Syntax:
     MOV Rd,Ra
Constraints:
     a≤7
     d≤7
Outcome:
     Rd ← R a
     PC ← PC + 1

3.4.11. ADDI: Unsigned Add Immediate
Encoding (format 2):

 0   0    0   1   0   1   0   d2 d1 d0 a2 a1 a0 i2     i1   i0



17                              Copyright © 2015 Embecosm Limited
Syntax:
     ADDI Rd,Ra,I
Constraints:
     a≤7
     d≤7
     I≤7
Outcome:
     Rd ← R a + I
     carry ← ( ( Ra + I ) ≥ 216 ) ? 1 : 0
     PC ← PC + 1
Notes:
     Adding constant zero can be used to clear the carry flag.

3.4.12. SUBI: Unsigned Subtract Immediate
Encoding (format 2):

 0   0    0   1   0   1   1   d2 d1 d0 a2 a1 a0 i2      i1   i0

Syntax:
     SUBI Rd,Ra,I
Constraints:
     a≤7
     d≤7
     I≤7
Outcome:
     Rd ← R a - I
     carry ← ( I > Ra ) ? 1 : 0
     PC ← PC + 1

3.4.13. ASRI: Arithmetic Shift Right Immediate
Encoding (format 2):

 0   0    0   1   1   0   0   d2 d1 d0 a2 a1 a0 i2      i1   i0

Syntax:
     ASRI Rd,Ra,I
Constraints:
     a≤7
     d≤7
     1≤I≤8
Outcome:



18                                Copyright © 2015 Embecosm Limited
     Rd ← ( Ra | ( carry << 16 ) ) >> I )
     carry ← 0
     PC ← PC + 1
Notes:
     The shift is encoded with a value 1 less than specified (i.e. a shift of 1 is encoded as 0002.
     The rationale is that shifting by zero is pointless. It is not needed to clear the carry flag,
     since there are other ways of clearing the it (for example adding constant zero).

3.4.14. LSLI: Logical Shift Left Immediate
Encoding (format 2):

 0   0    0   1   1   0   1   d2 d1 d0 a2 a1 a0 i2     i1   i0

Syntax:
     LSLI Rd,Ra,I
Constraints:
     a≤7
     d≤7
     1≤I≤8
Outcome:
     Rd ← Ra << I
     PC ← PC + 1
Notes:
     The shift is encoded with a value 1 less than specified (i.e. a shift of 1 is encoded as 0002.
     The rationale is that shifting by zero is pointless. It is not needed to clear the carry flag,
     since there are other ways of clearing the it (for example adding constant zero).

3.4.15. LSRI: Logical Shift Right Immediate
Encoding (format 2):

 0   0    0   1   1   1   0   d2 d1 d0 a2 a1 a0 i2     i1   i0

Syntax:
     LSRI Rd,Ra,I
Constraints:
     a≤7
     d≤7
     1≤I≤8
Outcome:
     Rd ← Ra >> I
     PC ← PC + 1
Notes:



19                              Copyright © 2015 Embecosm Limited
     The shift is encoded with a value 1 less than specified (i.e. a shift of 1 is encoded as 0002.
     The rationale is that shifting by zero is pointless. It is not needed to clear the carry flag,
     since there are other ways of clearing the it (for example adding constant zero).

3.4.16. MOVI: Move Immediate to Register
Encoding (format 5):

 0   0    0   1   1   1   1   d 2 d 1 d 0 i5   i4   i3   i2   i1   i0

Syntax:
     MOVI Rd,I
Constraints:
     d≤7
     I ≤ 63
Outcome:
     Rd ← I
     PC ← PC + 1

3.5. Detailed Descriptions of 16-bit Load/Store Instructions

3.5.1. LDB: Indexed Load Byte
Encoding (format 4):

 0   0    1   0   0   0   0   d2 d1 d0 a2 a1 a0 s2 s1 s0

Syntax:
     LDB Rd,(Ra,S)
Constraints:
     d≤7
     -4 ≤ S ≤ 3
Outcome:
     Rd ← dmem[Ra + SignExt(S)]
     PC ← PC + 1
Notes:
     This opcode accesses data memory, and the computed address is therefore a byte
     address. Accessing a non-existent memory location will trigger a bus error exception.

3.5.2. LDW: Indexed Load Word
Encoding (format 4):

 0   0    1   0   1   0   0   d2 d1 d0 a2 a1 a0 s2 s1 s0

Syntax:
     LDW Rd,(Ra,S)
Constraints:



20                               Copyright © 2015 Embecosm Limited
     d≤7
     -4 ≤ S ≤ 3
Outcome:
     Rd ← dmem [Ra + SignExt(S)] | (dmem[Ra + SignExt(S) + 1] << 8)
     PC ← PC + 1
Notes:
     This opcode accesses data memory, and the computed address is therefore a byte
     address. Accessing a non-existent memory location will trigger a bus error exception.

3.5.3. LDB: Indexed Load Byte with Postincrement
Encoding (format 4):

 0   0    1   0   0   0   1   d2 d1 d0 a2 a1 a0 s2 s1 s0

Syntax:
     LDB Rd,(Ra+,S)
Constraints:
     d≤7
     -4 ≤ S ≤ 3
Outcome:
     Rd ← dmem[Ra + SignExt(S)]
     Ra ← Ra + SignExt(S)
     PC ← PC + 1
Notes:
     This opcode accesses data memory, and the computed address is therefore a byte
     address. Accessing a non-existent memory location will trigger a bus error exception.

3.5.4. LDW: Indexed Load Word with Postincrement
Encoding (format 4):

 0   0    1   0   1   0   1   d2 d1 d0 a2 a1 a0 s2 s1 s0

Syntax:
     LDW Rd,(Ra+,S)
Constraints:
     d≤7
     -4 ≤ S ≤ 3
Outcome:
     Rd ← dmem[Ra + SignExt(S)] | (dmem[Ra + SignExt(S) + 1] << 8)
     Ra ← Ra + SignExt(S)
     PC ← PC + 1
Notes:



21                              Copyright © 2015 Embecosm Limited
     This opcode accesses data memory, and the computed address is therefore a byte
     address. Accessing a non-existent memory location will trigger a bus error exception.

3.5.5. LDB: Indexed Load Byte with Predecrement
Encoding (format 4):

 0   0    1   0   0   1   0   d2 d1 d0 a2 a1 a0 s2 s1 s0

Syntax:
     LDB Rd,(-Ra,S)
Constraints:
     d≤7
     -4 ≤ S ≤ 3
Outcome:
     Ra ← Ra - SignExt(S)
     Rd ← dmem[Ra]
     PC ← PC + 1
Notes:
     For the avoidance of doubt, the decrement of Ra is carried out before Ra is used to
     compute the address for loading.
     This opcode accesses data memory, and the computed address is therefore a byte
     address. Accessing a non-existent memory location will trigger a bus error exception.

3.5.6. LDW: Indexed Load Word with Predecrement
Encoding (format 4):

 0   0    1   0   1   1   0   d2 d1 d0 a2 a1 a0 s2 s1 s0

Syntax:
     LDW Rd,(-Ra,S)
Constraints:
     d≤7
     -4 ≤ S ≤ 3
Outcome:
     Ra ← Ra - SignExt(S)
     Rd ← dmem[Ra] | (dmem[Ra + 1] << 8)
     PC ← PC + 1
Notes:
     For the avoidance of doubt, the decrement of Ra is carried out before Ra is used to
     compute the address for loading.
     This opcode accesses data memory, and the computed address is therefore a byte
     address. Accessing a non-existent memory location will trigger a bus error exception.



22                              Copyright © 2015 Embecosm Limited
3.5.7. STB: Indexed Store Byte
Encoding (format 4):

 0   0    1   1   0   0   0   d2 d1 d0 a2 a1 a0 s2 s1 s0

Syntax:
     STB (Rd,S),Ra
Constraints:
     d≤7
     -4 ≤ S ≤ 3
Outcome:
     dmem[Rd + SignExt(S)] ← (Ra & 255)
     PC ← PC + 1
Notes:
     This opcode accesses data memory, and the computed address is therefore a byte
     address. Accessing a non-existent memory location will trigger a bus error exception.

3.5.8. STW: Indexed Store Word
Encoding (format 4):

 0   0    1   1   1   0   0   d2 d1 d0 a2 a1 a0 s2 s1 s0

Syntax:
     STW (Rd,S),Ra
Constraints:
     d≤7
     -4 ≤ S ≤ 3
Outcome:
     dmem[Rd + SignExt(S)] ← (Ra & 255)
     dmem[Rd + SignExt(S) + 1] ← (Ra >> 8)
     PC ← PC + 1
Notes:
     This opcode accesses data memory, and the computed address is therefore a byte
     address. Accessing a non-existent memory location will trigger a bus error exception.

3.5.9. STB: Indexed Store Byte with Postincrement
Encoding (format 4):

 0   0    1   1   0   0   1   d2 d1 d0 a2 a1 a0 s2 s1 s0

Syntax:
     STB (Rd+,S),Ra
Constraints:



23                              Copyright © 2015 Embecosm Limited
     d≤7
     -4 ≤ S ≤ 3
Outcome:
     dmem[Rd + SignExt(S)] ← (Ra & 255)
     Rd ← Rd + SignExt(S)
     PC ← PC + 1
Notes:
     This opcode accesses data memory, and the computed address is therefore a byte
     address. Accessing a non-existent memory location will trigger a bus error exception.

3.5.10. STW: Indexed Store Word with Postincrement
Encoding (format 4):

 0   0    1   1   1   0   1   d2 d1 d0 a2 a1 a0 s2 s1 s0

Syntax:
     STW (Rd+,S),Ra
Constraints:
     d≤7
     -4 ≤ S ≤ 3
Outcome:
     dmem[Rd + SignExt(S)] ← (Ra & 255)
     dmem[Rd + SignExt(S) + 1] ← (Ra >> 8)
     Rd ← Rd + SignExt(S)
     PC ← PC + 1
Notes:
     This opcode accesses data memory, and the computed address is therefore a byte
     address. Accessing a non-existent memory location will trigger a bus error exception.

3.5.11. STB: Indexed Store Byte with Predecrement
Encoding (format 4):

 0   0    1   1   0   1   0   d2 d1 d0 a2 a1 a0 s2 s1 s0

Syntax:
     STB (-Rd,S),Ra
Constraints:
     d≤7
     -4 ≤ S ≤ 3
Outcome:
     Rd ← Rd - SignExt(S)



24                              Copyright © 2015 Embecosm Limited
     dmem[Rd] ← (Ra & 255)
     PC ← PC + 1
Notes:
     For the avoidance of doubt, the decrement of Ra is carried out before Ra is used to
     compute the address for loading.
     This opcode accesses data memory, and the computed address is therefore a byte
     address. Accessing a non-existent memory location will trigger a bus error exception.

3.5.12. STW: Indexed Store Word with Predecrement
Encoding (format 4):

 0   0    1    1   1   1   0   d2 d1 d0 a2 a1 a0 s2 s1 s0

Syntax:
     STW (-Rd,S),Ra
Constraints:
     d≤7
     -4 ≤ S ≤ 3
Outcome:
     Rd ← Rd - SignExt(S)
     dmem[Rd] ← (Ra & 255)
     dmem[Rd + 1] ← (Ra >> 8)
     PC ← PC + 1
Notes:
     For the avoidance of doubt, the decrement of Ra is carried out before Ra is used to
     compute the address for loading.
     This opcode accesses data memory, and the computed address is therefore a byte
     address. Accessing a non-existent memory location will trigger a bus error exception.

3.6. Detailed Descriptions of 16-bit Branch/Jump Instructions
              Note
              The only branch/jump comparisons provided are for "equal", "not equal", "less
              than" and "greater than". Branch/jump comparisons for "less than or equal" and
              "greater than or equal" can be provided by using "greater than" and "less than"
              respectively in the opposite direction."
              Purists will point out that this reduces the opportunity for branch prediction and
              pipeline preservation. However the limited instruction space means not all opcodes
              can be provided.

3.6.1. BRA: Relative Branch
Encoding (format 7):

 0   1    0    0   0   0   0   s8 s7 s6 s5 s4 s3 s2 s1 s0

Syntax:



25                               Copyright © 2015 Embecosm Limited
     BRA S
Constraints:
     -256 ≤ S ≤ 255
Outcome:
     PC ← PC + SignExt(S)
Notes:
     Remember that the program counter is a word address, so the offset is the number of
     words by which to adjust the PC.
     Branching to a non-existent location will trigger a bus error exception.

3.6.2. BAL: Relative Branch and Link
Encoding (format 6):

 0   1    0   0   0   0   1   s5 s4 s3 s2 s1 s0 b2 b1 b0

Syntax:
     BAL S,Rb
Constraints:
     b≤7
     -32 ≤ S ≤ 31
Outcome:
     Rb ← PC + 1
     PC ← PC + SignExt(S)
Notes:
     Remember that the program counter is a word address, so the offset is the number of
     words by which to adjust the PC.
     Branching to a non-existent location will trigger a bus error exception.

3.6.3. BEQ: Relative Branch if Equal
Encoding (format 3):

 0   1    0   0   0   1   0   s2 s1 s0 a2 a1 a0 b2 b1 b0

Syntax:
     BEQ S,Ra,Rb
Constraints:
     a≤7
     b≤7
     -4 ≤ S ≤ 3
Outcome:
     PC ← (Ra = Rb) ? PC + SignExt(S) : PC + 1



26                              Copyright © 2015 Embecosm Limited
Notes:
     Remember that the program counter is a word address, so the offset is the number of
     words by which to adjust the PC.
     Branching to a non-existent location will trigger a bus error exception.

3.6.4. BNE: Relative Branch if Not Equal
Encoding (format 3):

 0   1    0   0   0   1   1   s2 s1 s0 a2 a1 a0 b2 b1 b0

Syntax:
     BNE S,Ra,Rb
Constraints:
     a≤7
     b≤7
     -4 ≤ S ≤ 3
Outcome:
     PC ← (Ra ≠ Rb) ? PC + SignExt(S) : PC + 1
Notes:
     Remember that the program counter is a word address, so the offset is the number of
     words by which to adjust the PC.
     Branching to a non-existent location will trigger a bus error exception.

3.6.5. BLTS: Relative Branch if Signed Less Than
Encoding (format 3):

 0   1    0   0   1   0   0   s2 s1 s0 a2 a1 a0 b2 b1 b0

Syntax:
     BLTS S,Ra,Rb
Constraints:
     a≤7
     b≤7
     -4 ≤ S ≤ 3
Outcome:
     PC ← (Ra < Rb) ? PC + SignExt(S) : PC + 1
Notes:
     The comparison between Ra and Rb is a signed comparison, where the contents of each
     register is treated as a 2's-complement signed number.
     Remember that the program counter is a word address, so the offset is the number of
     words by which to adjust the PC.
     Branching to a non-existent location will trigger a bus error exception.



27                              Copyright © 2015 Embecosm Limited
3.6.6. BLES: Relative Branch if Signed Less Than or Equal To
Encoding (format 3):

 0   1    0   0   1   0   1   s2 s1 s0 a2 a1 a0 b2 b1 b0

Syntax:
     BLES S,Ra,Rb
Constraints:
     a≤7
     b≤7
     -4 ≤ S ≤ 3
Outcome:
     PC ← (Ra ≤ Rb) ? PC + SignExt(S) : PC + 1
Notes:
     The comparison between Ra and Rb is a signed comparison, where the contents of each
     register is treated as a 2's-complement signed number.
     Remember that the program counter is a word address, so the offset is the number of
     words by which to adjust the PC.
     Branching to a non-existent location will trigger a bus error exception.

3.6.7. BLTU: Relative Branch if Unsigned Less Than
Encoding (format 3):

 0   1    0   0   1   1   0   s2 s1 s0 a2 a1 a0 b2 b1 b0

Syntax:
     BLTU S,Ra,Rb
Constraints:
     a≤7
     b≤7
     -4 ≤ S ≤ 3
Outcome:
     PC ← (Ra < Rb) ? PC + SignExt(S) : PC + 1
Notes:
     The comparison between Ra and Rb is an unsigned comparison.
     Remember that the program counter is a word address, so the offset is the number of
     words by which to adjust the PC.
     Branching to a non-existent location will trigger a bus error exception.

3.6.8. BLEU: Relative Branch if Unsigned Less Than or Equal To
Encoding (format 3):

 0   1    0   0   1   1   1   s2 s1 s0 a2 a1 a0 b2 b1 b0



28                              Copyright © 2015 Embecosm Limited
Syntax:
     BLEU S,Ra,Rb
Constraints:
     a≤7
     b≤7
     -4 ≤ S ≤ 3
Outcome:
     PC ← (Ra ≤ Rb) ? PC + SignExt(S) : PC + 1
Notes:
     The comparison between Ra and Rb is an unsigned comparison.
     Remember that the program counter is a word address, so the offset is the number of
     words by which to adjust the PC.
     Branching to a non-existent location will trigger a bus error exception.

3.6.9. JMP: Absolute Jump
Encoding (format 1):

 0   1    0   1   0   0   0   d2 d1 d0   0   0   0   0   0   0

Syntax:
     JMP Rd
Constraints:
     d≤7
Outcome:
     PC ← Rd
Notes:
     Remember that the program counter is a word address, so the value in Rd should be
     a word address.
     Jumping to a non-existent location will trigger a bus error exception.

3.6.10. JAL: Absolute Jump and Link
Encoding (format 1):

 0   1    0   1   0   0   1   d2 d1 d0   0   0   0   b2 b1 b0

Syntax:
     JAL Rd,Rb
Constraints:
     b≤7
     d≤7
Outcome:



29                              Copyright © 2015 Embecosm Limited
     Rb ← PC + 1
     PC ← Rd
Notes:
     Remember that the program counter is a word address, so the value in Rd should be
     a word address.
     Jumping to a non-existent location will trigger a bus error exception.

3.6.11. JEQ: Absolute Jump if Equal
Encoding (format 1):

 0   1    0   1   0   1   0   d2 d1 d0 a2 a1 a0 b2 b1 b0

Syntax:
     JEQ Rd,Ra,Rb
Constraints:
     a≤7
     b≤7
     d≤7
Outcome:
     PC ← (Ra = Rb) ? Rd : PC + 1
Notes:
     Remember that the program counter is a word address, so the value in Rd should be
     a word address.
     Jump to a non-existent location will trigger a bus error exception.

3.6.12. JNE: Absolute Jump if Not Equal
Encoding (format 1):

 0   1    0   1   0   1   0   d2 d1 d0 a2 a1 a0 b2 b1 b0

Syntax:
     JNE Rd,Ra,Rb
Constraints:
     a≤7
     b≤7
     d≤7
Outcome:
     PC ← (Ra ≠ Rb) ? Rd : PC + 1
Notes:
     Remember that the program counter is a word address, so the value in Rd should be
     a word address.
     Jump to a non-existent location will trigger a bus error exception.



30                              Copyright © 2015 Embecosm Limited
3.6.13. JLTS: Absolute Jump if Signed Less Than
Encoding (format 1):

 0   1    0   1   1   0   0   d2 d1 d0 a2 a1 a0 b2 b1 b0

Syntax:
     JLTS Rd,Ra,Rb
Constraints:
     a≤7
     b≤7
     d≤7
Outcome:
     PC ← (Ra < Rb) ? Rd : PC + 1
Notes:
     The comparison between Ra and Rb is a signed comparison, where the contents of each
     register is treated as a 2's-complement signed number.
     Remember that the program counter is a word address, so the value in Rd should be
     a word address.
     Jump to a non-existent location will trigger a bus error exception.

3.6.14. JLES: Absolute Jump if Signed Less Than or Equal To
Encoding (format 1):

 0   1    0   1   1   0   1   d2 d1 d0 a2 a1 a0 b2 b1 b0

Syntax:
     JLES Rd,Ra,Rb
Constraints:
     a≤7
     b≤7
     d≤7
Outcome:
     PC ← (Ra ≤ Rb) ? Rd : PC + 1
Notes:
     The comparison between Ra and Rb is a signed comparison, where the contents of each
     register is treated as a 2's-complement signed number.
     Remember that the program counter is a word address, so the value in Rd should be
     a word address.
     Jump to a non-existent location will trigger a bus error exception.

3.6.15. JLTU: Absolute Jump if Unsigned Less Than
Encoding (format 1):



31                              Copyright © 2015 Embecosm Limited
 0   1    0   1   1   1   0   d2 d1 d0 a2 a1 a0 b2 b1 b0

Syntax:
     JLTU Rd,Ra,Rb
Constraints:
     a≤7
     b≤7
     d≤7
Outcome:
     PC ← (Ra < Rb) ? Rd : PC + 1
Notes:
     The comparison between Ra and Rb is an unsigned comparison.
     Remember that the program counter is a word address, so the value in Rd should be
     a word address.
     Jump to a non-existent location will trigger a bus error exception.

3.6.16. JLEU: Absolute Jump if Unsigned Less Than or Equal To
Encoding (format 1):

 0   1    0   1   1   1   1   d2 d1 d0 a2 a1 a0 b2 b1 b0

Syntax:
     JLEU Rd,Ra,Rb
Constraints:
     a≤7
     b≤7
     d≤7
Outcome:
     PC ← (Ra ≤ Rb) ? Rd : PC + 1
Notes:
     The comparison between Ra and Rb is an unsigned comparison.
     Remember that the program counter is a word address, so the value in Rd should be
     a word address.
     Jump to a non-existent location will trigger a bus error exception.

3.7. Detailed Descriptions of 16-bit Miscellaneous Instructions

3.7.1. RTE: Return from Exception
Encoding (format 1):

 0   1    1   0   0   0   0   d2 d1 d0   0   0   0   0   0   0

Syntax:



32                              Copyright © 2015 Embecosm Limited
      RTE Rd
Constraints:
      d≤7
Outcome:
      PC ← Rd
Notes:
      This opcode is not fully defined, pending agreement on the exception mechanism for AAP.

3.8. Detailed Descriptions of 32-bit ALU Instructions
At this time, this section is incomplete.

3.8.1. NOP: No Operation
Encoding (format 14, first word at lower address):

 1   0    0    0   0   0   0   d 2 d 1 d 0 i5   i4   i3   i2   i1   i0

 0   0    0    0   0   0   0   d5 d4 d3 i11 i10 i9        i8   i7   i6

Syntax:
      NOP Rd,I
Constraints:
      d ≤ 63
      I ≤ 4095
Outcome:
      PC ← PC + 1
Notes:
      This opcode may trigger side-effects in implementations, depending on the value of I,
      particularly when simulating (see Section 2.3).
      There are no conventions for any values of d or I for the 32-bit version of NOP.

3.8.2. ADD: Unsigned Add
Encoding (format 8, first word at lower address):

 1   0    0    0   0   0   1   d2 d1 d0 a2 a1 a0 b2 b1 b0

 0   0    0    0   0   0   0   d5 d4 d3 a5 a4 a3 b5 b4 b3

Syntax:
      ADD Rd,Ra,Rb
Constraints:
      a ≤ 63
      b ≤ 63
      d ≤ 63



33                                Copyright © 2015 Embecosm Limited
Outcome:
     Rd ← R a + R b
     carry ← ( ( Ra + Rb ) ≥ 216 ) ? 1 : 0
     PC ← PC + 2

3.8.3. SUB: Unsigned Subtract
Encoding (format 8, first word at lower address):

 1   0    0   0   0   1   0   d2 d1 d0 a2 a1 a0 b2 b1 b0

 0   0    0   0   0   0   0   d5 d4 d3 a5 a4 a3 b5 b4 b3

Syntax:
     SUB Rd,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63
     d ≤ 63
Outcome:
     Rd ← Ra - Rb
     carry ← ( Rb > Ra ) ? 1 : 0
     PC ← PC + 2

3.8.4. AND: Bitwise AND
Encoding (format 8, first word at lower address):

 1   0    0   0   0   1   1   d2 d1 d0 a2 a1 a0 b2 b1 b0

 0   0    0   0   0   0   0   d5 d4 d3 a5 a4 a3 b5 b4 b3

Syntax:
     AND Rd,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63
     d ≤ 63
Outcome:
     Rd ← Ra & Rb
     PC ← PC + 2

3.8.5. OR: Bitwise OR
Encoding (format 8, first word at lower address):

 1   0    0   0   1   0   0   d2 d1 d0 a2 a1 a0 b2 b1 b0



34                              Copyright © 2015 Embecosm Limited
 0   0    0   0   0   0   0   d5 d4 d3 a5 a4 a3 b5 b4 b3

Syntax:
     OR Rd,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63
     d ≤ 63
Outcome:
     Rd ← R a | R b
     PC ← PC + 2

3.8.6. XOR: Bitwise Exclusive OR
Encoding (format 8, first word at lower address):

 1   0    0   0   1   0   1   d2 d1 d0 a2 a1 a0 b2 b1 b0

 0   0    0   0   0   0   0   d5 d4 d3 a5 a4 a3 b5 b4 b3

Syntax:
     XOR Rd,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63
     d ≤ 63
Outcome:
     Rd ← R a ^ R b
     PC ← PC + 2

3.8.7. ASR: Arithmetic Shift Right
Encoding (format 8, first word at lower address):

 1   0    0   0   1   1   0   d2 d1 d0 a2 a1 a0 b2 b1 b0

 0   0    0   0   0   0   0   d5 d4 d3 a5 a4 a3 b5 b4 b3

Syntax:
     ASR Rd,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63
     d ≤ 63
Outcome:



35                              Copyright © 2015 Embecosm Limited
     Rd ← ( Ra | ( carry << 16 ) ) >> Rb )
     carry ← 0
     PC ← PC + 2
Notes:
     If Rb ≥ 17 the result in Rd will be zero.
     The carry flag is always cleared, even if a shift of zero is specified.

3.8.8. LSL: Logical Shift Left
Encoding (format 8, first word at lower address):

 1   0    0   0   1   1   1   d2 d1 d0 a2 a1 a0 b2 b1 b0

 0   0    0   0   0   0   0   d5 d4 d3 a5 a4 a3 b5 b4 b3

Syntax:
     LSL Rd,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63
     d ≤ 63
Outcome:
     Rd ← Ra << Rb
     PC ← PC + 2
Notes:
     If Rb ≥ 16 the result in Rd will be zero.

3.8.9. LSR: Logical Shift Right
Encoding (format 8, first word at lower address):

 1   0    0   1   0   0   0   d2 d1 d0 a2 a1 a0 b2 b1 b0

 0   0    0   0   0   0   0   d5 d4 d3 a5 a4 a3 b5 b4 b3

Syntax:
     LSR Rd,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63
     d ≤ 63
Outcome:
     Rd ← Ra >> Rb
     PC ← PC + 2



36                              Copyright © 2015 Embecosm Limited
Notes:
     If Rb ≥ 16 the result in Rd will be zero.

3.8.10. MOV: Move Register to Register
Encoding (format 8, first word at lower address):

 1   0    0   1    0    0    1   d2 d1 d0 a2 a1 a0    0   0    0

 0   0    0   0    0    0    0   d5 d4 d3 a5 a4 a3    0   0    0

Syntax:
     MOV Rd,Ra
Constraints:
     a ≤ 63
     d ≤ 63
Outcome:
     Rd ← R a
     PC ← PC + 2

3.8.11. ADDI: Unsigned Add Immediate
Encoding (format 11, first word at lower address):

 1   0    0   1    0    1    0   d2 d1 d0 a2 a1 a0 i2     i1   i0

 0   0    0   i9   i8   i7   i6 d5 d4 d3 a5 a4 a3 i5      i4   i3

Syntax:
     ADDI Rd,Ra,I
Constraints:
     a ≤ 63
     d ≤ 63
     I ≤ 63
Outcome:
     Rd ← R a + I
     carry ← ( ( Ra + I ) ≥ 216 ) ? 1 : 0
     PC ← PC + 2
Notes:
     Adding constant zero can be used to clear the carry flag.

3.8.12. SUBI: Unsigned Subtract Immediate
Encoding (format 11, first word at lower address):

 1   0    0   1    0    1    1   d2 d1 d0 a2 a1 a0 i2     i1   i0

 0   0    0   i9   i8   i7   i6 d5 d4 d3 a5 a4 a3 i5      i4   i3



37                                 Copyright © 2015 Embecosm Limited
Syntax:
     SUBI Rd,Ra,I
Constraints:
     a ≤ 63
     d ≤ 63
     I ≤ 63
Outcome:
     Rd ← R a - I
     carry ← ( I > Ra ) ? 1 : 0
     PC ← PC + 2

3.8.13. ASRI: Arithmetic Shift Right Immediate
Encoding (format 9, first word at lower address):

 1   0    0   1   1   0   0   d2 d1 d0 a2 a1 a0 i2      i1   i0

 0   0    0   0   0   0   0   d5 d4 d3 a5 a4 a3 i5      i4   i3

Syntax:
     ASRI Rd,Ra,I
Constraints:
     a ≤ 63
     d ≤ 63
     1 ≤ I ≤ 64
Outcome:
     Rd ← ( Ra | ( carry << 16 ) ) >> I )
     carry ← 0
     PC ← PC + 2
Notes:
     If I ≥ 17 the result in Rd will be zero.
     The shift is encoded with a value 1 less than specified (i.e. a shift of 1 is encoded as
     0000002. The rationale is that shifting by zero is pointless. It is not needed to clear the
     carry flag, since there are other ways of clearing the it (for example adding constant zero).

3.8.14. LSLI: Logical Shift Left Immediate
Encoding (format 9, first word at lower address):

 1   0    0   1   1   0   1   d2 d1 d0 a2 a1 a0 i2      i1   i0

 0   0    0   0   0   0   0   d5 d4 d3 a5 a4 a3 i5      i4   i3

Syntax:
     LSLI Rd,Ra,I



38                                Copyright © 2015 Embecosm Limited
Constraints:
     a ≤ 63
     d ≤ 63
     1 ≤ I ≤ 64
Outcome:
     Rd ← Ra << I
     PC ← PC + 2
Notes:
     If I ≥ 16 the result in Rd will be zero.
     The shift is encoded with a value 1 less than specified (i.e. a shift of 1 is encoded as
     0000002. The rationale is that shifting by zero is pointless. It is not needed to clear the
     carry flag, since there are other ways of clearing the it (for example adding constant zero).

3.8.15. LSRI: Logical Shift Right Immediate
Encoding (format 9, first word at lower address):

 1   0    0   1   1   1   0   d2 d1 d0 a2 a1 a0 i2            i1   i0

 0   0    0   0   0   0   0   d5 d4 d3 a5 a4 a3 i5            i4   i3

Syntax:
     LSRI Rd,Ra,I
Constraints:
     a ≤ 63
     d ≤ 63
     1 ≤ I ≤ 64
Outcome:
     Rd ← Ra >> I
     PC ← PC + 2
Notes:
     If I ≥ 16 the result in Rd will be zero.
     The shift is encoded with a value 1 less than specified (i.e. a shift of 1 is encoded as
     0000002. The rationale is that shifting by zero is pointless. It is not needed to clear the
     carry flag, since there are other ways of clearing the it (for example adding constant zero).

3.8.16. MOVI: Move Immediate to Register
Encoding (format 15, first word at lower address):

 1   0    0   1   1   1   1   d 2 d 1 d 0 i5   i4   i3   i2   i1   i0

 0   0    0 i15 i14 i13 i12 d5 d4 d3 i11 i10 i9          i8   i7   i6

Syntax:
     MOVI Rd,I



39                               Copyright © 2015 Embecosm Limited
Constraints:
     d ≤ 63
     I ≤ 65535
Outcome:
     Rd ← I
     PC ← PC + 2

3.8.17. ADDC: Unsigned Add with Carry
Encoding (format 8, first word at lower address):

 1   0    0   0   0   0   1   d2 d1 d0 a2 a1 a0 b2 b1 b0

 0   0    0   0   0   0   1   d5 d4 d3 a5 a4 a3 b5 b4 b3

Syntax:
     ADDC Rd,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63
     d ≤ 63
Outcome:
     Rd ← Ra + Rb + carry
     carry ← ( ( Ra + Rb + carry) ≥ 216 ) ? 1 : 0
     PC ← PC + 2

3.8.18. SUBC: Unsigned Subtract with Carry
Encoding (format 8, first word at lower address):

 1   0    0   0   0   1   0   d2 d1 d0 a2 a1 a0 b2 b1 b0

 0   0    0   0   0   0   1   d5 d4 d3 a5 a4 a3 b5 b4 b3

Syntax:
     SUBC Rd,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63
     d ≤ 63
Outcome:
     Rd ← Ra - Rb - carry
     carry ← ((Rb + carry) > Ra) ? 1 : 0
     PC ← PC + 2



40                              Copyright © 2015 Embecosm Limited
3.8.19. ANDI: Bitwise AND Immediate
Encoding (format 10, first word at lower address):

 1   0    0   0    0    1    1   d2 d1 d0 a2 a1 a0 i2    i1   i0

 0   0    0   i8   i7   i6   1 d5 d4 d3 a5 a4 a3 i5      i4   i3

Syntax:
     ANDI Rd,Ra,I
Constraints:
     a ≤ 63
     d ≤ 63
     I ≤ 511
Outcome:
     Rd ← R a & I
     PC ← PC + 2

3.8.20. ORI: Bitwise OR immediate
Encoding (format 10, first word at lower address):

 1   0    0   0    1    0    0   d2 d1 d0 a2 a1 a0 i2    i1   i0

 0   0    0   i8   i7   i6   1 d5 d4 d3 a5 a4 a3 i5      i4   i3

Syntax:
     ORI Rd,Ra,I
Constraints:
     a ≤ 63
     d ≤ 63
     I ≤ 511
Outcome:
     Rd ← R a | I
     PC ← PC + 2

3.8.21. XORI: Bitwise Exclusive OR Immediate
Encoding (format 10, first word at lower address):

 1   0    0   0    1    0    1   d2 d1 d0 a2 a1 a0 i2    i1   i0

 0   0    0   i8   i7   i6   1 d5 d4 d3 a5 a4 a3 i5      i4   i3

Syntax:
     XORI Rd,Ra,I
Constraints:



41                                 Copyright © 2015 Embecosm Limited
     a ≤ 63
     d ≤ 63
     I ≤ 511
Outcome:
     Rd ← R a ^ I
     PC ← PC + 2

3.9. Detailed Descriptions of 32-bit Load/Store Instructions

3.9.1. LDB: Indexed Load Byte
Encoding (format 13, first word at lower address):

 1   0    1   0   0   0   0   d2 d1 d0 a2 a1 a0 s2 s1 s0

 0   0    0   s9 s8 s7 s6 d5 d4 d3 a5 a4 a3 s5 s4 s3

Syntax:
     LDB Rd,(Ra,S)
Constraints:
     d ≤ 63
     -512 ≤ S ≤ 511
Outcome:
     Rd ← dmem[Ra + SignExt(S)]
     PC ← PC + 2
Notes:
     This opcode accesses data memory, and the computed address is therefore a byte
     address. Accessing a non-existent memory location will trigger a bus error exception.

3.9.2. LDW: Indexed Load Word
Encoding (format 13, first word at lower address):

 1   0    1   0   1   0   0   d2 d1 d0 a2 a1 a0 s2 s1 s0

 0   0    0   s9 s8 s7 s6 d5 d4 d3 a5 a4 a3 s5 s4 s3

Syntax:
     LDW Rd,(Ra,S)
Constraints:
     d ≤ 63
     -512 ≤ S ≤ 511
Outcome:
     Rd ← dmem [Ra + SignExt(S)] | (dmem[Ra + SignExt(S) + 1] << 8)
     PC ← PC + 2



42                              Copyright © 2015 Embecosm Limited
Notes:
     This opcode accesses data memory, and the computed address is therefore a byte
     address. Accessing a non-existent memory location will trigger a bus error exception.

3.9.3. LDB: Indexed Load Byte with Postincrement
Encoding (format 13, first word at lower address):

 1   0    1   0   0   0   1   d2 d1 d0 a2 a1 a0 s2 s1 s0

 0   0    0   s9 s8 s7 s6 d5 d4 d3 a5 a4 a3 s5 s4 s3

Syntax:
     LDB Rd,(Ra+,S)
Constraints:
     d ≤ 63
     -512 ≤ S ≤ 511
Outcome:
     Rd ← dmem[Ra + SignExt(S)]
     Ra ← Ra + SignExt(S)
     PC ← PC + 2
Notes:
     This opcode accesses data memory, and the computed address is therefore a byte
     address. Accessing a non-existent memory location will trigger a bus error exception.

3.9.4. LDW: Indexed Load Word with Postincrement
Encoding (format 13, first word at lower address):

 1   0    1   0   1   0   1   d2 d1 d0 a2 a1 a0 s2 s1 s0

 0   0    0   s9 s8 s7 s6 d5 d4 d3 a5 a4 a3 s5 s4 s3

Syntax:
     LDW Rd,(Ra+,S)
Constraints:
     d ≤ 63
     -512 ≤ S ≤ 511
Outcome:
     Rd ← dmem [Ra + SignExt(S)] | (dmem[Ra + SignExt(S) + 1] << 8)
     Ra ← Ra + SignExt(S)
     PC ← PC + 2
Notes:
     This opcode accesses data memory, and the computed address is therefore a byte
     address. Accessing a non-existent memory location will trigger a bus error exception.



43                              Copyright © 2015 Embecosm Limited
3.9.5. LDB: Indexed Load Byte with Predecrement
Encoding (format 13, first word at lower address):

 1   0    1   0   0   1   0   d2 d1 d0 a2 a1 a0 s2 s1 s0

 0   0    0   s9 s8 s7 s6 d5 d4 d3 a5 a4 a3 s5 s4 s3

Syntax:
     LDB Rd,(-Ra,S)
Constraints:
     d ≤ 63
     -512 ≤ S ≤ 511
Outcome:
     Ra ← Ra - SignExt(S)
     Rd ← dmem[Ra]
     PC ← PC + 2
Notes:
     This opcode accesses data memory, and the computed address is therefore a byte
     address. Accessing a non-existent memory location will trigger a bus error exception.

3.9.6. LDW: Indexed Load Word with Predecrement
Encoding (format 13, first word at lower address):

 1   0    1   0   1   1   0   d2 d1 d0 a2 a1 a0 s2 s1 s0

 0   0    0   s9 s8 s7 s6 d5 d4 d3 a5 a4 a3 s5 s4 s3

Syntax:
     LDW Rd,(-Ra,S)
Constraints:
     d ≤ 63
     -512 ≤ S ≤ 511
Outcome:
     Ra ← Ra - SignExt(S)
     Rd ← dmem [Ra] | (dmem[Ra + 1] << 8)
     PC ← PC + 2
Notes:
     This opcode accesses data memory, and the computed address is therefore a byte
     address. Accessing a non-existent memory location will trigger a bus error exception.

3.9.7. STB: Indexed Store Byte
Encoding (format 13, first word at lower address):

 1   0    1   1   0   0   0   d2 d1 d0 a2 a1 a0 s2 s1 s0



44                              Copyright © 2015 Embecosm Limited
 0   0    0   s9 s8 s7 s6 d5 d4 d3 a5 a4 a3 s5 s4 s3

Syntax:
     STB (Rd,S),Ra
Constraints:
     d ≤ 63
     -512 ≤ S ≤ 511
Outcome:
     dmem[Rd + SignExt(S)] ← (Ra & 255)
     PC ← PC + 2
Notes:
     This opcode accesses data memory, and the computed address is therefore a byte
     address. Accessing a non-existent memory location will trigger a bus error exception.

3.9.8. STW: Indexed Store Word
Encoding (format 13, first word at lower address):

 0   0    1   1   1   0   0   d2 d1 d0 a2 a1 a0 s2 s1 s0

 0   0    0   s9 s8 s7 s6 d5 d4 d3 a5 a4 a3 s5 s4 s3

Syntax:
     STW (Rd,S),Ra
Constraints:
     d ≤ 63
     -512 ≤ S ≤ 511
Outcome:
     dmem[Rd + SignExt(S)] ← (Ra & 255)
     dmem[Rd + SignExt(S) + 1] ← (Ra >> 8)
     PC ← PC + 2
Notes:
     This opcode accesses data memory, and the computed address is therefore a byte
     address. Accessing a non-existent memory location will trigger a bus error exception.

3.9.9. STB: Indexed Store Byte with Postincrement
Encoding (format 13, first word at lower address):

 1   0    1   1   0   0   1   d2 d1 d0 a2 a1 a0 s2 s1 s0

 0   0    0   s9 s8 s7 s6 d5 d4 d3 a5 a4 a3 s5 s4 s3

Syntax:
     STB (Rd+,S),Ra
Constraints:



45                              Copyright © 2015 Embecosm Limited
     d ≤ 63
     -512 ≤ S ≤ 511
Outcome:
     dmem[Rd + SignExt(S)] ← (Ra & 255)
     Rd ← Rd + SignExt(S)
     PC ← PC + 2
Notes:
     This opcode accesses data memory, and the computed address is therefore a byte
     address. Accessing a non-existent memory location will trigger a bus error exception.

3.9.10. STW: Indexed Store Word with Postincrement
Encoding (format 13, first word at lower address):

 1   0    1   1   1   0   1   d2 d1 d0 a2 a1 a0 s2 s1 s0

 0   0    0   s9 s8 s7 s6 d5 d4 d3 a5 a4 a3 s5 s4 s3

Syntax:
     STW (Rd+,S),Ra
Constraints:
     d ≤ 63
     -512 ≤ S ≤ 511
Outcome:
     dmem[Rd + SignExt(S)] ← (Ra & 255)
     dmem[Rd + SignExt(S) + 1] ← (Ra >> 8)
     Rd ← Rd + SignExt(S)
     PC ← PC + 2
Notes:
     This opcode accesses data memory, and the computed address is therefore a byte
     address. Accessing a non-existent memory location will trigger a bus error exception.

3.9.11. STB: Indexed Store Byte with Predecrement
Encoding (format 13, first word at lower address):

 1   0    1   1   0   1   0   d2 d1 d0 a2 a1 a0 s2 s1 s0

 0   0    0   s9 s8 s7 s6 d5 d4 d3 a5 a4 a3 s5 s4 s3

Syntax:
     STB (-Rd,S),Ra
Constraints:
     d ≤ 63
     -512 ≤ S ≤ 511



46                              Copyright © 2015 Embecosm Limited
Outcome:
     Rd ← Rd - SignExt(S)
     dmem[Rd] ← (Ra & 255)
     PC ← PC + 2
Notes:
     For the avoidance of doubt, the decrement of Ra is carried out before Ra is used to
     compute the address for loading.
     This opcode accesses data memory, and the computed address is therefore a byte
     address. Accessing a non-existent memory location will trigger a bus error exception.

3.9.12. STW: Indexed Store Word with Predecrement
Encoding (format 13, first word at lower address):

 1   0    1    1   1   1   0   d2 d1 d0 a2 a1 a0 s2 s1 s0

 0   0    0   s9 s8 s7 s6 d5 d4 d3 a5 a4 a3 s5 s4 s3

Syntax:
     STW (-Rd,S),Ra
Constraints:
     d ≤ 63
     -512 ≤ S ≤ 511
Outcome:
     Rd ← Rd - SignExt(S)
     dmem[Rd] ← (Ra & 255)
     dmem[Rd + 1] ← (Ra >> 8)
     PC ← PC + 2
Notes:
     For the avoidance of doubt, the decrement of Ra is carried out before Ra is used to
     compute the address for loading.
     This opcode accesses data memory, and the computed address is therefore a byte
     address. Accessing a non-existent memory location will trigger a bus error exception.

3.10. Detailed Descriptions of 32-bit Branch/Jump Instructions
              Note
              As with the 16-bit instructions, only a limited range of comparisons is provided.
              See Section 3.6 for an explanation.

3.10.1. BRA: Relative Branch
Encoding (format 17, first word at lower address):

 1   1    0    0   0   0   0   s8 s7 s6 s5 s4 s3 s2 s1 s0

 0   0    0 s21 s20 s19 s18 s17 s16 s15 s14 s13 s12 s11 s10 s9



47                               Copyright © 2015 Embecosm Limited
Syntax:
     BRA S
Constraints:
     -2,097,152 ≤ S ≤ 2,097,151
Outcome:
     PC ← PC + SignExt(S)
Notes:
     Remember that the program counter is a word address, so the offset is the number of
     words by which to adjust the PC.
     Branching to a non-existent location will trigger a bus error exception.

3.10.2. BAL: Relative Branch and Link
Encoding (format 16, first word at lower address):

 1   1    0   0   0   0   1   s5 s4 s3 s2 s1 s0 b2 b1 b0

 0   0    0 s18 s17 s16 s15 s14 s13 s12 s11 s10 s9 b5 b4 b3

Syntax:
     BAL S,Rb
Constraints:
     b ≤ 63
     -262,144 ≤ S ≤ 262,141
Outcome:
     Rb ← PC + 2
     PC ← PC + SignExt(S)
Notes:
     Remember that the program counter is a word address, so the offset is the number of
     words by which to adjust the PC.
     Branching to a non-existent location will trigger a bus error exception.

3.10.3. BEQ: Relative Branch if Equal
Encoding (format 12, first word at lower address):

 1   1    0   0   0   1   0   s2 s1 s0 a2 a1 a0 b2 b1 b0

 0   0    0   s9 s8 s7 s6 s5 s4 s3 a5 a4 a3 b5 b4 b3

Syntax:
     BEQ S,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63



48                              Copyright © 2015 Embecosm Limited
     -512 ≤ S ≤ 511
Outcome:
     PC ← (Ra = Rb) ? PC + SignExt(S) : PC + 2
Notes:
     Remember that the program counter is a word address, so the offset is the number of
     words by which to adjust the PC.
     Branching to a non-existent location will trigger a bus error exception.

3.10.4. BNE: Relative Branch if Not Equal
Encoding (format 12, first word at lower address):

 1   1    0   0   0   1   1   s2 s1 s0 a2 a1 a0 b2 b1 b0

 0   0    0   s9 s8 s7 s6 s5 s4 s3 a5 a4 a3 b5 b4 b3

Syntax:
     BNE S,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63
     -512 ≤ S ≤ 511
Outcome:
     PC ← (Ra ≠ Rb) ? PC + SignExt(S) : PC + 2
Notes:
     Remember that the program counter is a word address, so the offset is the number of
     words by which to adjust the PC.
     Branching to a non-existent location will trigger a bus error exception.

3.10.5. BLTS: Relative Branch if Signed Less Than
Encoding (format 12, first word at lower address):

 1   1    0   0   1   0   0   s2 s1 s0 a2 a1 a0 b2 b1 b0

 0   0    0   s9 s8 s7 s6 s5 s4 s3 a5 a4 a3 b5 b4 b3

Syntax:
     BLTS S,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63
     -512 ≤ S ≤ 511
Outcome:
     PC ← (Ra < Rb) ? PC + SignExt(S) : PC + 2



49                              Copyright © 2015 Embecosm Limited
Notes:
     The comparison between Ra and Rb is a signed comparison, where the contents of each
     register is treated as a 2's-complement signed number.
     Remember that the program counter is a word address, so the offset is the number of
     words by which to adjust the PC.
     Branching to a non-existent location will trigger a bus error exception.

3.10.6. BLES: Relative Branch if Signed Less Than or Equal To
Encoding (format 12, first word at lower address):

 1   1    0   0   1   0   1   s2 s1 s0 a2 a1 a0 b2 b1 b0

 0   0    0   s9 s8 s7 s6 s5 s4 s3 a5 a4 a3 b5 b4 b3

Syntax:
     BLES S,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63
     -512 ≤ S ≤ 511
Outcome:
     PC ← (Ra ≤ Rb) ? PC + SignExt(S) : PC + 2
Notes:
     The comparison between Ra and Rb is a signed comparison, where the contents of each
     register is treated as a 2's-complement signed number.
     Remember that the program counter is a word address, so the offset is the number of
     words by which to adjust the PC.
     Branching to a non-existent location will trigger a bus error exception.

3.10.7. BLTU: Relative Branch if Unsigned Less Than
Encoding (format 12, first word at lower address):

 1   1    0   0   1   1   0   s2 s1 s0 a2 a1 a0 b2 b1 b0

 0   0    0   s9 s8 s7 s6 s5 s4 s3 a5 a4 a3 b5 b4 b3

Syntax:
     BLTU S,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63
     -512 ≤ S ≤ 511
Outcome:
     PC ← (Ra < Rb) ? PC + SignExt(S) : PC + 2



50                              Copyright © 2015 Embecosm Limited
Notes:
     The comparison between Ra and Rb is an unsigned comparison.
     Remember that the program counter is a word address, so the offset is the number of
     words by which to adjust the PC.
     Branching to a non-existent location will trigger a bus error exception.

3.10.8. BLEU: Relative Branch if Unsigned Less Than or Equal To
Encoding (format 12, first word at lower address):

 1   1    0   0   1   1   1   s2 s1 s0 a2 a1 a0 b2 b1 b0

 0   0    0   s9 s8 s7 s6 s5 s4 s3 a5 a4 a3 b5 b4 b3

Syntax:
     BLEU S,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63
     -512 ≤ S ≤ 511
Outcome:
     PC ← (Ra ≤ Rb) ? PC + SignExt(S) : PC + 2
Notes:
     The comparison between Ra and Rb is an unsigned comparison.
     Remember that the program counter is a word address, so the offset is the number of
     words by which to adjust the PC.
     Branching to a non-existent location will trigger a bus error exception.

3.10.9. JMP: Absolute Jump
Encoding (format 8, first word at lower address):

 1   1    0   1   0   0   0   d2 d1 d0   0   0   0   0   0   0

 0   0    0   1   0   0   0   d5 d4 d3   0   0   0   0   0   0

Syntax:
     JMP Rd
Constraints:
     d ≤ 63
Outcome:
     PC ← Rd
Notes:
     Remember that the program counter is a word address, so the value in Rd should be
     a word address.



51                              Copyright © 2015 Embecosm Limited
     Jumping to a non-existent location will trigger a bus error exception.

3.10.10. JAL: Absolute Jump and Link
Encoding (format 8, first word at lower address):

 1   1    0   1   0   0   1   d2 d1 d0   0   0   0   b2 b1 b0

 0   0    0   0   0   0   0   d5 d4 d3   0   0   0   b5 b4 b3

Syntax:
     JAL Rd,Rb
Constraints:
     b ≤ 63
     d ≤ 63
Outcome:
     Rb ← PC + 2
     PC ← Rd
Notes:
     Remember that the program counter is a word address, so the value in Rd should be
     a word address.
     Jumping to a non-existent location will trigger a bus error exception.

3.10.11. JEQ: Absolute Jump if Equal
Encoding (format 8, first word at lower address):

 1   1    0   1   0   1   0   d2 d1 d0 a2 a1 a0 b2 b1 b0

 0   0    0   0   0   0   0   d5 d4 d3 a5 a4 a3 b5 b4 b3

Syntax:
     JEQ Rd,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63
     d ≤ 63
Outcome:
     PC ← (Ra = Rb) ? Rd : PC + 2
Notes:
     Remember that the program counter is a word address, so the value in Rd should be
     a word address.
     Jump to a non-existent location will trigger a bus error exception.

3.10.12. JNE: Absolute Jump if Not Equal
Encoding (format 8, first word at lower address):



52                              Copyright © 2015 Embecosm Limited
 1   1    0   1   0   1   0   d2 d1 d0 a2 a1 a0 b2 b1 b0

 0   0    0   0   0   0   0   d5 d4 d3 a5 a4 a3 b5 b4 b3

Syntax:
     JNE Rd,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63
     d ≤ 63
Outcome:
     PC ← (Ra ≠ Rb) ? Rd : PC + 2
Notes:
     Remember that the program counter is a word address, so the value in Rd should be
     a word address.
     Jump to a non-existent location will trigger a bus error exception.

3.10.13. JLTS: Absolute Jump if Signed Less Than
Encoding (format 8, first word at lower address):

 1   1    0   1   1   0   0   d2 d1 d0 a2 a1 a0 b2 b1 b0

 0   0    0   0   0   0   0   d5 d4 d3 a5 a4 a3 b5 b4 b3

Syntax:
     JLTS Rd,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63
     d ≤ 63
Outcome:
     PC ← (Ra < Rb) ? Rd : PC + 2
Notes:
     The comparison between Ra and Rb is a signed comparison, where the contents of each
     register is treated as a 2's-complement signed number.
     Remember that the program counter is a word address, so the value in Rd should be
     a word address.
     Jump to a non-existent location will trigger a bus error exception.

3.10.14. JLES: Absolute Jump if Signed Less Than or Equal To
Encoding (format 8, first word at lower address):

 1   1    0   1   1   0   1   d2 d1 d0 a2 a1 a0 b2 b1 b0



53                              Copyright © 2015 Embecosm Limited
 0   0    0   0   0   0   0   d5 d4 d3 a5 a4 a3 b5 b4 b3

Syntax:
     JLES Rd,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63
     d ≤ 63
Outcome:
     PC ← (Ra ≤ Rb) ? Rd : PC + 2
Notes:
     The comparison between Ra and Rb is a signed comparison, where the contents of each
     register is treated as a 2's-complement signed number.
     Remember that the program counter is a word address, so the value in Rd should be
     a word address.
     Jump to a non-existent location will trigger a bus error exception.

3.10.15. JLTU: Absolute Jump if Unsigned Less Than
Encoding (format 8, first word at lower address):

 1   1    0   1   1   1   0   d2 d1 d0 a2 a1 a0 b2 b1 b0

 0   0    0   0   0   0   0   d5 d4 d3 a5 a4 a3 b5 b4 b3

Syntax:
     JLTU Rd,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63
     d ≤ 63
Outcome:
     PC ← (Ra < Rb) ? Rd : PC + 2
Notes:
     The comparison between Ra and Rb is an unsigned comparison.
     Remember that the program counter is a word address, so the value in Rd should be
     a word address.
     Jump to a non-existent location will trigger a bus error exception.

3.10.16. JLEU: Absolute Jump if Unsigned Less Than or Equal To
Encoding (format 8, first word at lower address):

 1   1    0   1   1   1   1   d2 d1 d0 a2 a1 a0 b2 b1 b0



54                              Copyright © 2015 Embecosm Limited
 0   0    0   0   0   0   0   d5 d4 d3 a5 a4 a3 b5 b4 b3

Syntax:
     JLEU Rd,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63
     d ≤ 63
Outcome:
     PC ← (Ra ≤ Rb) ? Rd : PC + 2
Notes:
     The comparison between Ra and Rb is an unsigned comparison.
     Remember that the program counter is a word address, so the value in Rd should be
     a word address.
     Jump to a non-existent location will trigger a bus error exception.

3.10.17. JMPL: Absolute Jump Long
Encoding (format 8, first word at lower address):

 1   1    0   1   0   0   0   d2 d1 d0   0   0   0   0   0   0

 0   0    0   0   0   0   1   d5 d4 d3   0   0   0   0   0   0

Syntax:
     JMPL Rd
Constraints:
     d ≤ 62
     (d % 2) = 2
Outcome:
     PC ← (Rd+1 << 16) | Rd
Notes:
     Remember that the program counter is a word address, so the value in Rd should be
     a word address.
     Jumping to a non-existent location will trigger a bus error exception.

3.10.18. JALL: Absolute Jump Long and Link
Encoding (format 8, first word at lower address):

 1   1    0   1   0   0   1   d2 d1 d0   0   0   0   b2 b1 b0

 0   0    0   0   0   0   1   d5 d4 d3   0   0   0   b5 b4 b3

Syntax:



55                              Copyright © 2015 Embecosm Limited
     JALL Rd,Rb
Constraints:
     b ≤ 63
     d ≤ 62
     (d % 2) = 2
Outcome:
     Rb ← PC + 2
     PC ← (Rd+1 << 16) | Rd
Notes:
     Remember that the program counter is a word address, so the value in Rd should be
     a word address.
     Jumping to a non-existent location will trigger a bus error exception.

3.10.19. JEQL: Absolute Jump Long if Equal
Encoding (format 8, first word at lower address):

 1   1    0   1   0   1   0   d2 d1 d0 a2 a1 a0 b2 b1 b0

 0   0    0   0   0   0   1   d5 d4 d3 a5 a4 a3 b5 b4 b3

Syntax:
     JEQL Rd,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63
     d ≤ 62
     (d % 2) = 2
Outcome:
     PC ← (Ra = Rb) ? ((Rd+1 << 16) | Rd) : PC + 2
Notes:
     Remember that the program counter is a word address, so the value in Rd should be
     a word address.
     Jump to a non-existent location will trigger a bus error exception.

3.10.20. JNEL: Absolute Jump Long if Not Equal
Encoding (format 8, first word at lower address):

 1   1    0   1   0   1   0   d2 d1 d0 a2 a1 a0 b2 b1 b0

 0   0    0   0   0   0   1   d5 d4 d3 a5 a4 a3 b5 b4 b3

Syntax:
     JNEL Rd,Ra,Rb



56                              Copyright © 2015 Embecosm Limited
Constraints:
     a ≤ 63
     b ≤ 63
     d ≤ 62
     (d % 2) = 2
Outcome:
     PC ← (Ra ≠ Rb) ? ((Rd+1 << 16) | Rd) : PC + 2
Notes:
     Remember that the program counter is a word address, so the value in Rd should be
     a word address.
     Jump to a non-existent location will trigger a bus error exception.

3.10.21. JLTSL: Absolute Jump Long if Signed Less Than
Encoding (format 8, first word at lower address):

 1   1    0   1   1   0   0   d2 d1 d0 a2 a1 a0 b2 b1 b0

 0   0    0   0   0   0   1   d5 d4 d3 a5 a4 a3 b5 b4 b3

Syntax:
     JLTSL Rd,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63
     d ≤ 62
     (d % 2) = 2
Outcome:
     PC ← (Ra < Rb) ? ((Rd+1 << 16) | Rd) : PC + 2
Notes:
     The comparison between Ra and Rb is a signed comparison, where the contents of each
     register is treated as a 2's-complement signed number.
     Remember that the program counter is a word address, so the value in Rd should be
     a word address.
     Jump to a non-existent location will trigger a bus error exception.

3.10.22. JLESL: Absolute Jump Long if Signed Less Than or Equal To
Encoding (format 8, first word at lower address):

 1   1    0   1   1   0   1   d2 d1 d0 a2 a1 a0 b2 b1 b0

 0   0    0   0   0   0   1   d5 d4 d3 a5 a4 a3 b5 b4 b3

Syntax:



57                              Copyright © 2015 Embecosm Limited
     JLESL Rd,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63
     d ≤ 62
     (d % 2) = 2
Outcome:
     PC ← (Ra ≤ Rb) ? ((Rd+1 << 16) | Rd) : PC + 2
Notes:
     The comparison between Ra and Rb is a signed comparison, where the contents of each
     register is treated as a 2's-complement signed number.
     Remember that the program counter is a word address, so the value in Rd should be
     a word address.
     Jump to a non-existent location will trigger a bus error exception.

3.10.23. JLTUL: Absolute Jump Long if Unsigned Less Than
Encoding (format 8, first word at lower address):

 1   1    0   1   1   1   0   d2 d1 d0 a2 a1 a0 b2 b1 b0

 0   0    0   0   0   0   1   d5 d4 d3 a5 a4 a3 b5 b4 b3

Syntax:
     JLTUL Rd,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63
     d ≤ 62
     (d % 2) = 2
Outcome:
     PC ← (Ra < Rb) ? ((Rd+1 << 16) | Rd) : PC + 2
Notes:
     The comparison between Ra and Rb is an unsigned comparison.
     Remember that the program counter is a word address, so the value in Rd should be
     a word address.
     Jump to a non-existent location will trigger a bus error exception.

3.10.24. JLEUL: Absolute Jump Long if Unsigned Less Than or Equal To
Encoding (format 8, first word at lower address):

 1   1    0   1   1   1   1   d2 d1 d0 a2 a1 a0 b2 b1 b0



58                              Copyright © 2015 Embecosm Limited
 0   0    0   0   0   0   1   d5 d4 d3 a5 a4 a3 b5 b4 b3

Syntax:
     JLEUL Rd,Ra,Rb
Constraints:
     a ≤ 63
     b ≤ 63
     d ≤ 62
     (d % 2) = 2
Outcome:
     PC ← (Ra ≤ Rb) ? ((Rd+1 << 16) | Rd) : PC + 2
Notes:
     The comparison between Ra and Rb is an unsigned comparison.
     Remember that the program counter is a word address, so the value in Rd should be
     a word address.
     Jump to a non-existent location will trigger a bus error exception.

3.11. Detailed Descriptions of 32-bit Miscellaneous Instructions
There are currently no 32-bit instructions defined in this class.




59                              Copyright © 2015 Embecosm Limited
Chapter 4. ABI
4.1. Defined Registers
Because of the variability in the architecture it is difficult to be too rigid on the ABI. In any
case part of the purpose of this architecture to allow exploration of different ABI's. Within this
section, the identifier Rmax is used to indicate the highest numbered register in the architecture.
The meanings of the following registers are defined.
•     R0: Link Register
•     R1: Stack Pointer
Note in particular no frame pointer is defined. It is up to the implementer to decide policy with
regard to use of a frame pointer.

4.2. Calling Convention
Again this is flexible, particularly where there can be very few registers. These are the general
guidelines.
•     All byte arguments are promoted to 16-bits.
•     Arguments are passed in R2–R7 (or R2–Rmax if there are fewer than 8 registers).
•     Results are returned on the same registers used to pass arguments.
•     Varargs are always passed on the stack.
•     A good guideline is that approximately one third of unallocated registers should be caller
      saved, although that can increase to one half where there are plenty of registers. The
      following registers (if present) are caller saved: R10, R13, R16, R19, R22, R25, R28, R31, R33,
      R35, R37, R39, R41, R43, R45, R47, R49, R51, R53, R55, R57, R59, R61 and R63.




60                             Copyright © 2015 Embecosm Limited