CALL8 — Call PC-relative, Rotate Window by 8

Instruction Word

Slot
Inst
6
3
6
2
6
1
6
0
5
9
5
8
5
7
5
6
5
5
5
4
5
3
5
2
5
1
5
0
4
9
4
8
4
7
4
6
4
5
4
4
4
3
4
2
4
1
4
0
3
9
3
8
3
7
3
6
3
5
3
4
3
3
3
2
3
1
3
0
2
9
2
8
2
7
2
6
2
5
2
4
2
3
2
2
2
1
2
0
1
9
1
8
1
7
1
6
1
5
1
4
1
3
1
2
1
1
1
0
9876543210
Format x24 - 24 bit(s) 0
CALL8 100101
offset 1
7
1
6
1
5
1
4
1
3
1
2
1
1
1
0
9876543210

Assembler Syntax

CALL8 label

Description

(please consult the Xtensa ® Instruction Set Architecture Reference Manual for any cross references and additional information)

CALL8 calls subroutines using the register windows mechanism, requesting the callee rotate the window by eight registers. The CALL8 instruction does not rotate the window itself, but instead stores the window increment for later use by the ENTRY instruction. The return address and window increment are placed in the caller's a8 (the callee's a0), and the processor then branches to the target address. The return address is the address of the next instruction (the address of the CALL8 instruction plus three). The window increment is also stored in the CALLINC field of the PS register, where it is accessed by the ENTRY instruction.

The target instruction address must be a 32-bit aligned ENTRY instruction. This allows CALL8 to have a larger effective range (524284 to 524288 bytes). The target instruction address of the call is given by the address of the CALL8 instruction with the two least significant bits set to zero, plus the sign-extended 18-bit offset field of the instruction shifted by two, plus four.

See the CALLX8 instruction for calling routines where the target address is given by the contents of a register.

Use the RETW and RETW.N instructions to return from a subroutine called by CALL8.

The window increment stored with the return address register in a8 occupies the two most significant bits of the register, and therefore those bits must be filled in by the subroutine return. The RETW and RETW.N instructions fill in these bits from the two most significant bits of their own address. This prevents register-window calls from being used to call a routine in a different 1GB region of the address space.

See the CALL0 instruction for calling routines using the non-windowed subroutine protocol.

The caller's a8..a15 are the same registers as the callee's a0..a7 after the callee executes the ENTRY instruction. You can use these registers for parameter passing. The caller's a0..a7 are hidden by CALL8, and therefore you may use them to keep values that are live across the call.

Operation

WindowCheck (00, 00, 10)
PS.CALLINC ← 10
AR[1000] ← 10||(nextPC)29..0
nextPC ← (PC31..2 + (offset1712||offset) + 1)||00

Exceptions

EveryInstR Group (see EveryInstR Group:)

Implementation Pipeline

In Out
PSCALLINC Estage