40 Hardware Reference Manual
Intel® IXP2800 Network Processor
Technical Description
As shown in Example 1, there is a latency in loading LM_ADDR. Until the new value is loaded,
the old value is still usable. Example 5 shows the maximum pipelined usage of LM_ADDR.
LM_ADDR can also be used as the base of a 16 32-bit word region of memory, with the instruction
specifying the offset from that base, as shown in Example 6. The source and destination can use
different offsets.
Note: Local Memory has 640 32-bit words. The local memory pointers (LM_ADDR) have an addressing
range of up to 1K longwords. However, only 640 longwords are currently populated with RAM.
Therefore:
0 – 639 (0x0 – 0x27F) are addressable as local memory.
640 – 1023 (0x280 – 0x3FF) are addressable, but not populated with RAM.
To the programmer, all instructions using Local Memory act as follows, including
read/modify/write instructions like immed_w0, ld_field, etc.
1. Read LM_ADDR location (if LM_ADDR is specified as source).
2. Execute logic function.
3. Write LM_ADDR location (if LM_ADDR is specified as destination).
4. If specified, increment or decrement LM_ADDR.
5. Proceed to next instruction.
Example 7 is legal because lm_addr_0[2] does not post-modify LM_ADDR.
In Example 7, the programmer sees:
1. Read Local Memory memory location pointed to by LM_ADDR.
2. Invert the data.
3. Write the data into the address pointed to by LM_ADDR with the value of 2 that is OR’ed into
the lower bits.
4. Increment LM_ADDR.
5. Proceed to next instruction.
Example 5. Maximum Pipelined Usage of LM_ADDR
local_csr_wr[INDIRECT_LM_ADDR_0, gpr_m]
local_csr_wr[INDIRECT_LM_ADDR_0, gpr_n]
local_csr_wr[INDIRECT_LM_ADDR_0, gpr_o]
local_csr_wr[INDIRECT_LM_ADDR_0, gpr_p]
alu[dest_reg1, *l$index0, op, src_reg1] ; uses address from gpr_m
alu[dest_reg2, *l$index0, op, src_reg2] ; uses address from gpr_n
alu[dest_reg3, *l$index0, op, src_reg3] ; uses address from gpr_o
alu[dest_reg4, *l$index0, op, src_reg4] ; uses address from gpr_p
Example 6. LM_ADDR Used as Base of a 16 32-Bit Word Region of Local Memory
alu[*l$index0[3], *l$index0[4], +, 1]
Example 7. LM_ADDR Use as Source and Destination
alu[*l$index0[2], --, ~B, *l$index0]