Fact-checked by Grok 2 weeks ago

Link register

A link register is a special-purpose register in certain processor architectures, such as , PowerPC, and , that holds the return address following a subroutine or function call. In architectures, it is known as the link register (LR), corresponding to R14 in AArch32 or X30 in . This register stores the address to which execution returns after completing the call. The mechanism enables efficient returns by directly loading the LR into the (PC) using instructions like BX LR or RET. Branch-with-link instructions such as BL automatically update the LR during calls, but the callee must save it to the for nested calls to preserve the return address. The LR also supports exception management: on exception entry, it is set to an EXC_RETURN value encoding the return mode and state, enabling exception returns for C handlers without extra . In , the LR is unbanked and can function as a general-purpose register when the return address is stored elsewhere, while separate Exception Link Registers (ELRs) manage inter-exception-level returns for levels EL1 to EL3.

Overview

Definition

The link register is a special-purpose register in certain (RISC) architectures that stores the return address—the address of the instruction immediately following a branch-and-link or subroutine call instruction—enabling the processor to resume execution at the correct location upon return. This design optimizes procedure calls by avoiding the need to push and pop return addresses onto the in simple cases, with the register updated automatically by branch-and-link instructions such as BL in or bl in . Key characteristics of the link register include its width, which typically matches the processor's —32 bits in 32-bit modes or 64 bits in 64-bit modes—to accommodate full or physical addresses without . During a subroutine call, the branch-with-link updates the link register with the address of the following the call, overwriting previous contents. For nested calls, the callee must save the link register to the before invoking another subroutine to preserve the return address, but in some implementations, it may be overwritten for temporary general-purpose use outside of branch contexts, requiring careful management to avoid corrupting return addresses. Unlike general-purpose registers, the link register functions as a specialized alias with hardware-enforced behavior: branch instructions automatically load the return address into it, and return instructions (e.g., bx lr in ARM or blr in Power ISA) branch to its value, distinguishing it from registers used solely for data manipulation. For instance, in the ARM architecture, it aliases register R14, allowing dual use but triggering specific hardware actions during branches.

Role in Subroutine Calls

In RISC architectures, the link register plays a central role in facilitating efficient subroutine calls by storing the return address directly in hardware, avoiding immediate memory access. When a subroutine is invoked, a branch-with-link —such as in or in PowerPC—automatically loads the address of the instruction immediately following the call into the link register while simultaneously transferring control to the subroutine's target address. This mechanism ensures that the return address is preserved in a fast-access register, enabling seamless resumption of the caller after the subroutine completes. The return from a subroutine is achieved by branching to the address held in the , typically using an instruction like in or blr in PowerPC. This operation loads the saved into the , directing execution back to the calling routine without additional overhead from operations in simple cases. By keeping the return address in a dedicated register, this approach minimizes compared to stack-based alternatives and supports high-performance in procedural code. Within established calling conventions, such as the ARM Architecture Procedure Call Standard (AAPCS) or the System V ABI for PowerPC, the link register integrates seamlessly to handle optimizations like s. In a , where the subroutine's final action is another subroutine invocation, the hardware can directly branch to the target without updating or preserving the link register, as the original caller's remains valid. This automatic handling prevents unnecessary growth and enhances efficiency in recursive or chained scenarios, aligning with the conventions' emphasis on register-based parameter passing and return value management.

Design and Functionality

Mechanism of Operation

The link register facilitates subroutine execution through a precise sequence of operations involving the (PC). When a branch-with-link instruction is encountered, the first increments the PC to the address of the subsequent after the branch, adjusting for any prefetch or delay inherent to the , and stores this value in the link register (LR). The PC is then updated to the target of the subroutine, initiating execution of the called routine. Upon reaching the return point in the subroutine, typically via a dedicated , the contents of the LR are loaded directly into the PC, restoring the flow of control to the calling program. This process ensures seamless resumption without immediate reliance on memory-based storage. PC-relative addressing plays a key role in accurately setting the LR value, as the must account for the instruction's position and any architectural offsets to compensate for behavior. In many RISC designs, the stored is the PC value plus an offset—such as +4 in Thumb mode, where 16-bit instructions and a two-stage necessitate this adjustment to point precisely to the instruction following the . Similarly, in 32-bit mode, the offset is +8 to align with the prefetch mechanism, ensuring the LR captures the correct resumption point despite fetch-ahead execution. These adjustments maintain correctness across varying depths without altering the . Beyond its primary role in returns, the link register exhibits dual-use flexibility as a general-purpose during periods when no immediate subroutine linkage is required, allowing it to hold temporary data values in software routines. However, this versatility demands explicit management by the or : before invoking another subroutine that would overwrite the LR, its current contents must be preserved, often by pushing to the , and restored afterward to safeguard the original . This software-mediated handling underscores the link register's efficiency in leaf procedures while requiring careful coordination for deeper call chains.

Handling Nested and Leaf Procedures

In leaf procedures, which are subroutines that do not invoke any further subroutines, the link register retains the original from the caller without risk of overwriting, as no subsequent branch-and-link instructions are executed. This allows the procedure to return directly by branching to the address stored in the link register, eliminating the overhead of stack operations for preservation. Such routines are common in optimized code where inner calls are absent, enabling simpler and faster execution paths. For nested procedures that include calls to other subroutines, software intervention is required to manage the link register, as an inner branch-and-link instruction would otherwise overwrite the outer return address. Typically, the procedure prologue pushes the link register onto the stack before any inner calls to save the return address safely. Upon completion of the inner subroutine and return to the caller, the epilogue pops the saved value back into the link register, restoring the original address for the final return. This stack-based preservation ensures correct control flow in multi-level invocations. Recursive procedures, involving self-calls, extend nesting indefinitely based on input depth, amplifying the need for link register management and potentially leading to when the accumulated frames exceed allocated memory limits. Compilers address this through optimizations like elimination, which detects cases where the recursive call is the final action and replaces it with a direct jump, reusing the existing link register and stack frame to prevent unnecessary growth. This technique maintains functional equivalence while bounding stack usage, particularly beneficial in architectures relying on link registers for returns.

Implementations in Architectures

Architecture

In the architecture, the link register serves as a dedicated general-purpose register for storing return addresses during subroutine calls. In the AArch32 execution state, corresponding to 32-bit modes, it is designated as R14, commonly referred to as LR. In the AArch64 execution state, introduced for 64-bit operations, the link register is X30, also denoted as LR, which operates alongside separate exception link registers (ELR_ELx) for handling returns from exceptions. Within AArch32, the link register is banked across different exception modes, allowing preservation of return addresses during switches. This setup enables instructions like MOVS PC, LR or LDM with the 'S' bit (to restore SPSR) to perform exception returns by loading the address from the banked LR while updating the CPSR from the SPSR. Key instructions in leverage the link register for subroutine management. The Branch with Link (BL) instruction performs a subroutine call by loading the target address into the (PC) and simultaneously storing the address (adjusted for prefetch) into LR. Returns are typically executed using Branch and Exchange to Link Register (BX LR) in AArch32, which branches to the address in LR while potentially switching between and Thumb instruction sets based on the least significant bit. For preserving LR across nested calls, function prologs and epilogs employ Load/Store Multiple instructions, such as STMDB (Store Multiple Decrement Before) to push LR onto the alongside other callee-saved registers like R4-R8, and LDMIA (Load Multiple Increment After) to restore them, often combining restoration with a by loading into PC. The implementation of the link register has evolved across ARM versions to enhance efficiency and security. In ARMv4, the link register supported the introduction of the Thumb instruction set, where BL adjusted the return address to account for 16-bit instructions. Subsequent versions like ARMv6 and ARMv7 refined in AArch32, maintaining R14's role while adding support for more modes. The shift to ARMv8 marked a significant change with , expanding LR to 64 bits as X30 and introducing distinct ELR registers for exceptions to simplify . Starting with ARMv8.3, Pointer Authentication Code (PAC) extensions were added for security, embedding cryptographic authentication codes into unused high-order bits of pointers, including those in the link register, to verify return addresses and mitigate attacks like . Compiler conventions for the link register are governed by the ARM Architecture Procedure Call Standard (AAPCS), which standardizes register usage across functions. Under AAPCS, leaf functions—those not calling other subroutines—need not save LR, as its value remains valid for direct return. However, in non-leaf functions, the callee must preserve LR by storing it on the stack before any nested calls, typically as part of the stack frame alongside other callee-saved registers (R4-R11 in AArch32 or X19-X29 in AArch64), and restore it in the epilogue to ensure correct returns. This convention maintains ABI compatibility and supports optimized code generation in tools like GCC and LLVM.

PowerPC and Other RISC Processors

In the PowerPC architecture, the (LR) functions as a special-purpose register (SPR) designed to hold the return address for subroutine calls, with a size of 32 bits in 32-bit implementations or 64 bits in 64-bit implementations. The (bl) instruction automatically loads the address of the next sequential instruction into LR when the link (LK) bit is set, enabling efficient subroutine invocation. Manual manipulation of LR is supported through the (move to link register) instruction, which transfers a value from a general-purpose register (GPR) to LR, and the (move from link register) instruction, which moves LR's contents to a GPR, allowing programmers to adjust or inspect the return address as needed. Returns from subroutines typically occur by branching to the address in LR using instructions such as (branch to link register). Other RISC architectures exhibit variations in link register implementations, often adapting the concept to their register file structures and branch mechanisms. In SPARC, the return address is stored in the caller-saved %o7 register (output register 7), which the CALL instruction populates with the program counter value plus an offset to account for the delayed branch slot, ensuring the subsequent instruction executes before the transfer. This design integrates with SPARC's register windows, where %o7 shifts to the callee's %i7 upon execution of a SAVE instruction, facilitating parameter passing and returns in nested procedures without immediate stack access; returns are then performed via a jump indirect loaded (jmpl) to %o7 + 8 or equivalent. The MIPS architecture employs ra (register 31) as a conventional return address holder within its 32 GPRs, lacking a dedicated SPR but relying on the jump and link (jal) instruction to set ra to the address of the instruction following the call (PC + 4). Subroutine returns use the jump register (jr ra) instruction to branch to this value, with ra requiring explicit preservation on the stack for non-leaf procedures since it is treated as volatile. In some MIPS extensions, return handling may involve coprocessor registers for enhanced functionality, though the base architecture maintains $ra's GPR-based approach. Early RISC designs, such as RISC-I, deviated from a dedicated link by using fixed registers within overlapping register windows to manage subroutine calls and returns, allowing direct parameter passing between caller and callee windows to minimize overhead. These windows, typically consisting of shared local and parameter registers, enable returns by restoring the appropriate window context rather than loading a global link value. Variations across RISC processors also include separate link registers (ILR) in certain designs to handle exceptions without overwriting the primary link register.

Advantages and Limitations

Performance Benefits

The link register significantly reduces in subroutine returns, particularly for leaf procedures, by enabling direct to the return address stored in the register rather than retrieving it from via the . In ARM Cortex-M3 and later architectures, a return using an instruction like MOV PC, LR or BX LR typically incurs 1 to 3 cycles, depending on refill effects, whereas emulating a stack-based return requires additional PUSH {LR} (2 cycles) and POP {PC} (5 cycles) operations, totaling 4 to 8 cycles including overhead. This avoidance of operations minimizes stalls and interactions, providing measurable efficiency gains in performance-critical code paths. By obviating the need to allocate stack space for the return address in leaf routines—which do not invoke further subroutines—the link register conserves and alleviates pressure on limited resources common in embedded systems. Each unsaved return address avoids committing 4 bytes (for a 32-bit ) to the per call, preventing unnecessary setup and reducing the risk of stack overflows in resource-constrained environments like microcontrollers. The link register further unlocks compiler optimizations such as tail call elimination, where a subroutine branches directly to another without preserving its own on the , and improved inlining of small functions. These techniques streamline in recursive or call-intensive algorithms; for instance, compilers leverage the register to convert tail calls into simple branches, yielding speedups in benchmarks dominated by frequent subroutine invocations.

Challenges in Deep Call Stacks

In deeply nested or calls, the link register (LR) must be explicitly saved to the before making a subsequent call, as the LR is overwritten by the new , and restored upon return to preserve the original caller's address. This process typically involves two instructions in ARM AArch64—such as STR to store LR on the and LDR to load it back—adding overhead per nesting level that accumulates in deep call stacks and can offset the efficiency gains of LR usage in shallower scenarios. Similar save/restore requirements apply in PowerPC, where the LR must be preserved before nested subroutine calls to avoid corruption. The link register introduces security vulnerabilities in deep call stacks, particularly through (ROP) attacks, where attackers exploit control over the stack to hijack the LR by chaining short instruction sequences (gadgets) ending in returns to the LR, enabling unauthorized code execution. In architectures, mitigations like Pointer Authentication Codes (), introduced in Armv8.3-A, address this by cryptographically signing the LR with instructions such as PACIASP before storage and authenticating with AUTIASP before use, which faults on tampering and reduces exploitable ROP gadgets in libraries like from over 16,500 to around 200—a 97.65% decrease. However, is specific to recent designs and not available in older versions or architectures like PowerPC, leaving persistent ROP risks in those environments without equivalent hardware protections. The link register's specialized role exacerbates resource contention during compiler register allocation, as its use for return addresses limits availability for temporary variables, often forcing spills to memory in functions with high register pressure from numerous live values. This issue intensifies in interrupt-heavy systems, where the LR may need separate preservation or banking—such as ARM's mode-specific LR registers for exceptions—to prevent conflicts between subroutine returns and interrupt handling, potentially requiring additional stack operations or dedicated interrupt link registers in some RISC designs.

Comparison to Alternatives

Stack-Based Return Mechanisms

Stack-based return mechanisms utilize the program's call stack—a last-in, first-out (LIFO) data structure in memory—to manage return addresses for subroutines, enabling the to resume execution at the appropriate point after a completes. During a subroutine call, the calling instruction automatically pushes the return address (the memory location of the instruction immediately following the call) onto the top of the . Upon return, the corresponding return instruction pops this address from the and loads it into the (or instruction pointer), transferring control back to the caller. This process ensures correct sequencing in program flow without requiring additional hardware beyond the general-purpose stack pointer register. A representative example is found in the x86 architecture, a classic CISC design. The CALL instruction pushes the current value of the 32-bit EIP (Extended Instruction Pointer) or 64-bit (Register Instruction Pointer) onto the , capturing the return address. The RET instruction then pops this value into EIP or , adjusting the pointer accordingly to deallocate the entry. This mechanism is integral to x86's variable-length instruction set and supports complex , including interrupts and exceptions that may interact with the . Stack frames, which encompass the return address along with other elements like saved registers, local variables, and parameters, provide a structured layout for function execution. In the System V ABI for —adopted by many systems—the return address resides at an of 8 bytes from the base pointer (%rbp) within the callee's frame, ensuring portability and consistency across compilers and operating systems. The caller pushes the return address via CALL, while the callee's RET pops it, maintaining stack alignment (typically 16 bytes) for efficient access. The universality of stack-based returns lies in their ability to accommodate arbitrary levels of procedure nesting and , limited only by available rather than fixed resources. This contrasts with link registers in certain RISC architectures, which require explicit saving to the for nested calls to avoid overwriting. Such flexibility makes stack-based mechanisms prevalent in CISC architectures like x86, where the serves multifaceted roles without necessitating specialized .

Dedicated Return Address Stacks

Dedicated return address stacks are specialized structures designed to manage subroutine return addresses independently from the main stack or , optimizing in processors where function call depth is limited and predictable. These stacks typically consist of a small, on-chip , often ranging from 8 to 32 entries, dedicated exclusively to storing return addresses to minimize latency associated with accesses during calls and returns. In stack-based architectures, such as those inspired by Forth or early stack machines like the KDF9, the return operates alongside a separate stack, providing efficient handling of nested subroutines without contaminating storage. The operation of a dedicated return address stack involves automatic hardware-managed push and pop actions triggered by call and return instructions. Upon executing a subroutine call, the (the instruction following the call) is pushed onto the , while a instruction pops the top entry to update the , enabling direct branching back to the caller. This mechanism is faster than relying on the main memory stack, as on-chip access reduces cycle overhead, though the limited depth necessitates overflow prevention strategies, such as software checks or traps for deep . In VLIW processors tailored for , like the CEVA-X family, the return address stack integrates with branch prediction units to support ultra-low-latency context switching in applications. Such stacks find primary use in embedded systems and DSPs, where call graphs are shallow and performance-critical, allowing predictable execution without the overhead of general-purpose stack management. For instance, in Forth-oriented embedded processors, the return facilitates rapid subroutine linkage in control-intensive tasks like . Comparisons in these domains indicate that dedicated stacks achieve return latencies comparable to single-register mechanisms while offering advantages in interrupt handling, as the entire can be context-switched more efficiently than individual registers, preserving nested call states during handler invocation.

References

  1. [1]
    R14, Link Register (LR) - Arm Developer
    R14 is also called the Link Register (LR). This holds the return address when calling a function or subroutine.Missing: definition | Show results with:definition
  2. [2]
    Link registers - Arm Instruction Set Reference Guide
    In AArch64 state, the Link Register (LR) stores the return address when a subroutine call is made. It can also be used as a general-purpose register if the ...Missing: definition | Show results with:definition
  3. [3]
    [PDF] Power ISA (Version 3.1B) - RCS Wiki
    Sep 14, 2021 · ... definition of a Compliancy Subset provided in the Power ISA. Page 4 ... Link Register . . . . . . . . . . . . . . . . 35. 2.3.3 Count ...
  4. [4]
    Register usage in subroutine calls - Arm Developer
    Places the return address in the link register. Sets the PC to the address of the subroutine. After the subroutine code has executed you can use a BX ...Missing: RISC | Show results with:RISC
  5. [5]
    Assembler-level subroutine linkage conventions - IBM
    The linkage convention allows for argument passing and return values to be in registers (FPRs, GPRs, VRs or multiple register types), memory, or both. The ...
  6. [6]
    None
    ### Summary of Tail Calls and Link Register in ARM Procedure Call Standard
  7. [7]
    [PDF] Elementary Introduction to Computer Architecture - Alan Clements
    ... link register. The only way you can nest subroutine calls using the link register mechanism is to save the link register. Example. Let's create a very simple ...
  8. [8]
    [PDF] Instruction Set Architecture
    When the subroutine completes its task, the Return instruction returns to the calling program by branching indirectly through the link register. The Call ...<|control11|><|separator|>
  9. [9]
    [PDF] ARM Instruction Set
    Branch with Link (BL) writes the old PC into the link register (R14) of the current bank. The PC value written into R14 is adjusted to allow for the prefetch, ...
  10. [10]
    [PDF] ARM Architecture Reference Manual Thumb-2 Supplement
    This Thumb-2 supplement introduces Thumb-2, changes to Thumb assembly syntax, new 32-bit and 16-bit Thumb instructions, and new 32-bit ARM instructions.
  11. [11]
    [PDF] Subroutines and Stack
    • JALR instruction (Jump And Link Register). – Format: jalr $rs. – Jumps to ... – Leaf procedure: A procedure that does not call another procedure.
  12. [12]
    Stack operations for nested subroutines - Arm Developer
    ... stack, and at exit they can be popped off again. In addition, if the link register is pushed onto the stack at entry, additional subroutine calls can be ...
  13. [13]
    [PDF] The ARM-THUMB Procedure Call Standard
    Nov 5, 1998 · into the link register (LR) and the destination address into the program counter. ... If it is a leaf routine, it need not check the stack limit ...
  14. [14]
    [PDF] MIPS Assembly Procedures
    ... Link Register). • Before we look at this instruction, let's look at two ... A stack overflow is when the stack gets too large (usually, when it exceeds ...
  15. [15]
    [PDF] Computer Organization and Design RISC-V Edition
    ... link register instruction branches to the address stored in register x1 ... tail-call optimization in this function? If no, explain why not. If yes ...
  16. [16]
    Registers in AArch64 - other registers - Arm Developer
    X30 is used as the Link Register and can be referred to as LR . Separate registers, ELR_ELx , are used for returning from exceptions. This is discussed in ...
  17. [17]
    [PDF] ARM Architecture Reference Manual
    ARM, the ARM Powered logo, Thumb, and StrongARM are registered trademarks of ARM Limited. ... Link register. Register 14 is the Link Register (LR). This ...Missing: AArch64 | Show results with:AArch64
  18. [18]
    B, BL, BX, BLX, and BXJ - Arm Developer
    The BL and BLX instructions copy the address of the next instruction into LR ( R14 , the link register). The BX and BLX instructions can change the processor ...
  19. [19]
  20. [20]
    ARM Architecture – Registers and Exception Model
    Mar 26, 2024 · This blog will capture the ARM interrupt architecture along with the evolution of the same from the early ARMv4 to the latest ARMv8 models.
  21. [21]
    Arm CPU Security Update: Pointer Authentication - Arm Developer
    Aug 21, 2025 · The Pointer Authentication feature was implemented in Arm Architecture version Armv8.3-A (FEAT_PAuth). Later versions of the Arm Architecture ...<|separator|>
  22. [22]
    [PDF] Procedure Call Standard for the ARM Architecture
    Oct 16, 2009 · This document describes the Procedure Call Standard use by the Application Binary Interface (ABI) for the. ARM architecture. Keywords. Procedure ...
  23. [23]
    [PDF] PowerPC User Instruction Set Architecture Book I Version 2.01
    This document defines the PowerPC User Instruction. Set Architecture. It covers the base instruction set and related facilities available to the application pro ...
  24. [24]
    [PDF] The SPARC Architecture Manual, Version 9 - Texas Computer Science
    Welcome to SPARC-V9, the most significant change to the SPARC architecture since it was announced in 1987. SPARC-V9 extends the addresses of SPARC to 64 ...
  25. [25]
    [PDF] Procedures Procedure Call and Return - University of Pittsburgh
    • $ra: return address register (set by call, used by return). ▫ Call chains. • One procedure calls another, which calls another one. • E.g., main → reverse ...
  26. [26]
    [PDF] MIPS Instruction Set
    For switch, procedure return jump and link jal 1000 $ra=PC+4; go to address 1000 Use when making procedure call. This saves the return address in $ra. System ...
  27. [27]
    [PDF] RISC I: A REDUCED INSTRUCTION SET VLSI COMPUTER
    Overlapping sets of register banks that can pass parameters directly to subroutines are largely responsible for the excellent performance of RISC I. Static and ...
  28. [28]
    [PDF] Design and implementation of RISC I - UC Berkeley EECS
    The execution time of a RISC I cycle is given by the time it takes to read a register, perform an ALU operation, and store the result back into a register.Missing: early | Show results with:early
  29. [29]
    Instruction set summary - Cortex-M0 Technical Reference Manual r0p0
    Table 3.1 shows the Cortex-M0 instructions and their cycle counts. The cycle counts are based on a system with zero wait-states. Depends on multiplier ...
  30. [30]
    Cortex M3 Instruction Set Summary - Mbed
    Table 1 shows the Cortex-M3 instructions and their cycle counts. The cycle counts are based on a system with zero wait states. Within the assembler syntax ...
  31. [31]
    Call Stacks and Link Registers - eklitzke.org
    Oct 23, 2016 · The technique is to use something called a "link register", henceforth called a LR. ... RISC architecture offsets that by allowing for faster or ...
  32. [32]
    Procedure Call Standard - Arm Developer
    The function of the program counter, link register and stack pointer ought to be clear. If not, read Registers. The IP (R12) register can be used by the linker, ...Missing: tail | Show results with:tail
  33. [33]
    Arm Compiler optimization
    Tailcall optimization and tail recursion: A tailcall is a call immediately before a return. Normally this function is called, and when it returns to the ...
  34. [34]
    [PDF] Cortex-M4F Instructions used in ARM Assembly for Embedded ...
    Dec 15, 2020 · Floating-Point PUSH/POP. Operation. Clock Cycles. VPUSH. {FP register ... Clock Cycle counts do not include delays due to stalls when an ...
  35. [35]
    Procedure Call Standard - Arm Developer
    This guide introduces the A64 instruction set, used in the 64-bit Armv8-A architecture, also known as AArch64.
  36. [36]
    15. PowerPC Specific Information - RTEMS Documentation Project
    Link Register: The LR contains the return address after a function call. This register must be saved before a subsequent subroutine call can be made. The use ...
  37. [37]
    Code reuse attacks: the compiler story - Arm Developer
    May 23, 2019 · With the link register protected by return address signing, an attacker looks for another means to control the flow of execution. There are two ...
  38. [38]
    [PDF] Towards a More Principled Compiler: Register Allocation and ...
    the functions in Figure 2.6 had to generate spill code, it is clearly important that the compiler ... register pressure, and then the register allocator is ...
  39. [39]
    [PDF] Exception and Interrupt Handling in ARM - UMD ECE Class Sites
    Link Register Offset ... System architects must balance between two things, first is to handle multiple interrupts.<|separator|>
  40. [40]
    Stack Computers: 3.2 A GENERIC STACK MACHINE
    The only difference is that the return stack is used to store subroutine return addresses instead of instruction operands. 3.2.1.4 ALU and top-of-stack register.
  41. [41]
    Stack Computers: 2.1 THE THREE AXIS STACK DESIGN SPACE
    The most obvious example of a stack supported function is a single stack used to support subroutine return addresses. Often times this stack also is used to ...<|control11|><|separator|>
  42. [42]
    [PDF] The NEW CEVA-X Processors
    Return address stack. Static branch prediction. 32-bit HW support for division and multiplication. Up to 8 scalar operations in parallel. Zero-latency ISA for ...
  43. [43]
    Stack Computers: 6.2 ARCHITECTURAL DIFFERENCES FROM ...
    Stack machines superior to conventional machines in the areas of program size, processor complexity, system complexity, processor performance, and consistency ...Missing: mechanisms | Show results with:mechanisms