Intel 64 and IA-32 Architectures Software Developers Manual Volume 1, Basic Architecture
6-12 Vol. 1
PROCEDURE CALLS, INTERRUPTS, AND EXCEPTIONS
• In 64-bit mode and compatibility mode, 64-bit call-gate descriptors for far calls
are available
In 64-bit mode, the operand size for all near branches (CALL, RET, JCC, JCXZ, JMP,
and LOOP) is forced to 64 bits. These instructions update the 64-bit RIP without the
need for a REX operand-size prefix.
The following aspects of near branches are controlled by the effective operand size:
• Truncation of the size of the instruction pointer
• Size of a stack pop or push, due to a CALL or RET
• Size of a stack-pointer increment or decrement, due to a CALL or RET
• Indirect-branch operand size
In 64-bit mode, all of the above actions are forced to 64 bits regardless of operand
size prefixes (operand size prefixes are silently ignored). However, the displacement
field for relative branches is still limited to 32 bits and the address size for near
branches is not forced in 64-bit mode.
Address sizes affect the size of RCX used for JCXZ and LOOP; they also impact the
address calculation for memory indirect branches. Such addresses are 64 bits by
default; but they can be overridden to 32 bits by an address size prefix.
Software typically uses far branches to change privilege levels. The legacy IA-32
architecture provides the call-gate mechanism to allow software to branch from one
privilege level to another, although call gates can also be used for branches that do
not change privilege levels. When call gates are used, the selector portion of the
direct or indirect pointer references a gate descriptor (the offset in the instruction is
ignored). The offset to the destination’s code segment is taken from the call-gate
descriptor.
64-bit mode redefines the type value of a 32-bit call-gate descriptor type to a 64-bit
call gate descriptor and expands the size of the 64-bit descriptor to hold a 64-bit
offset. The 64-bit mode call-gate descriptor allows far branches that reference any
location in the supported linear-address space. These call gates also hold the target
code selector (CS), allowing changes to privilege level and default size as a result of
the gate transition.
Because immediates are generally specified up to 32 bits, the only way to specify a
full 64-bit absolute RIP in 64-bit mode is with an indirect branch. For this reason,
direct far branches are eliminated from the instruction set in 64-bit mode.
64-bit mode also expands the semantics of the SYSENTER and SYSEXIT instructions
so that the instructions operate within a 64-bit memory space. The mode also intro-
duces two new instructions: SYSCALL and SYSRET (which are valid only in 64-bit
mode). For details, see “SYSENTER—Fast System Call” and “SYSEXIT—Fast Return
from Fast System Call” in Chapter 4, “Instruction Set Reference, N-Z,” of the Intel®
64 and IA-32 Architectures Software Developer’s Manual, Volume 2B.