# Software stack

The Hexagon processor includes dedicated registers and instructions
to support a call stack for subroutine execution.

The stack structure follows standard C conventions.

## Stack structure

The stack is defined to grow from high addresses to low addresses.
The stack pointer register SP points to the data element that is on
the top of the stack.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by Microsoft Visio, SVG Export pic_stack.svg Page-1 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="5.48186in" height="6.17607in" viewbox="0 0 394.694 444.677" xml:space="preserve" color-interpolation-filters="sRGB" class="st9"><v:documentproperties v:langid="1033" v:viewmarkup="false">	<v:userdefs>		<v:ud v:nameu="msvConvertTheme"></v:ud>	</v:userdefs></v:documentproperties>
<style>.svg-1 .st1 { stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.75 }
.svg-1 .st2 { fill: #2a2aea; font-family: Roboto; font-size: 0.826584em; font-weight: bold }
.svg-1 .st3 { fill: #ffffff; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.75 }
.svg-1 .st4 { stroke: #2a2aea; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.20152 }
.svg-1 .st5 { fill: #2a2aea; font-family: Roboto; font-size: 0.826584em }
.svg-1 .st6 { fill: #2a2aea; stroke: #2a2aea; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.75 }
.svg-1 .st7 { fill: #ffffff; stroke: #2a2aea; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.75 }
.svg-1 .st8 { stroke: #2a2aea; stroke-dasharray: 5.04, 3.6; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.72 }
.svg-1 .st9 { fill: none; fill-rule: evenodd; font-size: 12px; overflow: visible; stroke-linecap: square; stroke-miterlimit: 3 }</style>
<g v:mid="0" v:index="1" v:groupcontext="foregroundPage">	<title>Page-1</title>	<v:pageproperties v:drawingscale="1" v:pagescale="1" v:drawingunits="19" v:shadowoffsetx="9" v:shadowoffsety="-9"></v:pageproperties>	<g id="group2-1" transform="translate(18,-18)" v:mid="2" v:groupcontext="group">		<title>Sheet.2</title>		<g id="shape4-2" v:mid="4" v:groupcontext="shape" transform="translate(294.729,-192.422)">			<title>Sheet.4</title>			<desc>FP register</desc>			<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>			<v:textrect cx="31.8134" cy="438.723" width="63.63" height="11.9064"></v:textrect>			<path d="M63.63 432.77 L0 432.77 L0 444.68 L63.63 444.68 L63.63 432.77" class="st1"></path>			<text x="7.31" y="441.7" class="st2" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>FP register</text>			</g>		<g id="shape5-6" v:mid="5" v:groupcontext="shape" transform="translate(90.8836,-366.932)">			<title>Sheet.5</title>			<path d="M0 426.78 L0 444.68 L163.32 444.68 L163.32 426.78 L0 426.78 L0 426.78 Z" class="st3"></path>		</g>		<g id="shape6-8" v:mid="6" v:groupcontext="shape" transform="translate(90.8836,-366.932)">			<title>Sheet.6</title>			<path d="M0 444.68 L163.32 444.68 L163.32 426.78 L0 426.78 L0 444.68 L0 444.68" class="st4"></path>		</g>		<g id="shape7-11" v:mid="7" v:groupcontext="shape" transform="translate(150.389,-369.922)">			<title>Sheet.7</title>			<desc>Saved LR</desc>			<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>			<v:textrect cx="27.0652" cy="438.723" width="54.14" height="11.9064"></v:textrect>			<path d="M54.13 432.77 L0 432.77 L0 444.68 L54.13 444.68 L54.13 432.77" class="st1"></path>			<text x="6.65" y="441.7" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Saved LR</text>			</g>		<g id="shape8-15" v:mid="8" v:groupcontext="shape" transform="translate(90.8836,-349.033)">			<title>Sheet.8</title>			<path d="M0 426.78 L0 444.68 L163.32 444.68 L163.32 426.78 L0 426.78 L0 426.78 Z" class="st3"></path>		</g>		<g id="shape9-17" v:mid="9" v:groupcontext="shape" transform="translate(90.8836,-349.033)">			<title>Sheet.9</title>			<path d="M0 444.68 L163.32 444.68 L163.32 426.78 L0 426.78 L0 444.68 L0 444.68" class="st4"></path>		</g>		<g id="shape10-20" v:mid="10" v:groupcontext="shape" transform="translate(150.389,-352.022)">			<title>Sheet.10</title>			<desc>Saved FP</desc>			<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>			<v:textrect cx="27.0625" cy="438.723" width="54.13" height="11.9064"></v:textrect>			<path d="M54.12 432.77 L0 432.77 L0 444.68 L54.12 444.68 L54.12 432.77" class="st1"></path>			<text x="6.5" y="441.7" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Saved FP</text>			</g>		<g id="shape11-24" v:mid="11" v:groupcontext="shape" transform="translate(90.8836,-223.739)">			<title>Sheet.11</title>			<path d="M0 319.38 L0 444.68 L163.32 444.68 L163.32 319.38 L0 319.38 L0 319.38 Z" class="st3"></path>		</g>		<g id="shape12-26" v:mid="12" v:groupcontext="shape" transform="translate(90.8836,-223.739)">			<title>Sheet.12</title>			<path d="M0 444.68 L163.32 444.68 L163.32 319.38 L0 319.38 L0 444.68 L0 444.68" class="st4"></path>		</g>		<g id="shape13-29" v:mid="13" v:groupcontext="shape" transform="translate(135.796,-286.392)">			<title>Sheet.13</title>			<desc>Procedure local</desc>			<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>			<v:textrect cx="45.1363" cy="438.723" width="90.28" height="11.9064"></v:textrect>			<path d="M90.27 432.77 L0 432.77 L0 444.68 L90.27 444.68 L90.27 432.77" class="st1"></path>			<text x="10.68" y="441.7" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Procedure local  </text>			</g>		<g id="shape14-33" v:mid="14" v:groupcontext="shape" transform="translate(140.862,-274.46)">			<title>Sheet.14</title>			<desc>data on stack</desc>			<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>			<v:textrect cx="37.8428" cy="438.723" width="75.69" height="11.9064"></v:textrect>			<path d="M75.69 432.77 L0 432.77 L0 444.68 L75.69 444.68 L75.69 432.77" class="st1"></path>			<text x="8.03" y="441.7" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>data on stack</text>			</g>		<g id="shape15-37" v:mid="15" v:groupcontext="shape" transform="translate(90.8836,-205.84)">			<title>Sheet.15</title>			<path d="M0 426.78 L0 444.68 L163.32 444.68 L163.32 426.78 L0 426.78 L0 426.78 Z" class="st3"></path>		</g>		<g id="shape16-39" v:mid="16" v:groupcontext="shape" transform="translate(90.8836,-205.84)">			<title>Sheet.16</title>			<path d="M0 444.68 L163.32 444.68 L163.32 426.78 L0 426.78 L0 444.68 L0 444.68" class="st4"></path>		</g>		<g id="shape17-42" v:mid="17" v:groupcontext="shape" transform="translate(150.389,-208.83)">			<title>Sheet.17</title>			<desc>Saved LR</desc>			<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>			<v:textrect cx="27.0652" cy="438.723" width="54.14" height="11.9064"></v:textrect>			<path d="M54.13 432.77 L0 432.77 L0 444.68 L54.13 444.68 L54.13 432.77" class="st1"></path>			<text x="6.65" y="441.7" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Saved LR</text>			</g>		<g id="shape18-46" v:mid="18" v:groupcontext="shape" transform="translate(90.8836,-187.941)">			<title>Sheet.18</title>			<path d="M0 426.78 L0 444.68 L163.32 444.68 L163.32 426.78 L0 426.78 L0 426.78 Z" class="st3"></path>		</g>		<g id="shape19-48" v:mid="19" v:groupcontext="shape" transform="translate(90.8836,-187.941)">			<title>Sheet.19</title>			<path d="M0 444.68 L163.32 444.68 L163.32 426.78 L0 426.78 L0 444.68 L0 444.68" class="st4"></path>		</g>		<g id="shape20-51" v:mid="20" v:groupcontext="shape" transform="translate(150.389,-190.93)">			<title>Sheet.20</title>			<desc>Saved FP</desc>			<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>			<v:textrect cx="27.0625" cy="438.723" width="54.13" height="11.9064"></v:textrect>			<path d="M54.12 432.77 L0 432.77 L0 444.68 L54.12 444.68 L54.12 432.77" class="st1"></path>			<text x="6.5" y="441.7" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Saved FP</text>			</g>		<g id="shape21-55" v:mid="21" v:groupcontext="shape" transform="translate(264.485,-198.382)">			<title>Sheet.21</title>			<path d="M26.01 444.68 L0 444.68" class="st4"></path>		</g>		<g id="shape22-58" v:mid="22" v:groupcontext="shape" transform="translate(254.202,-194.653)">			<title>Sheet.22</title>			<path d="M11.19 444.68 L0 440.95 L11.19 437.22 L11.19 444.68 L11.19 444.68 Z" class="st6"></path>		</g>		<g id="shape23-60" v:mid="23" v:groupcontext="shape" transform="translate(294.426,-110.384)">			<title>Sheet.23</title>			<desc>SP register</desc>			<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>			<v:textrect cx="32.1337" cy="438.723" width="64.27" height="11.9064"></v:textrect>			<path d="M64.27 432.77 L0 432.77 L0 444.68 L64.27 444.68 L64.27 432.77" class="st1"></path>			<text x="7.3" y="441.7" class="st2" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>SP register</text>			</g>		<g id="shape24-64" v:mid="24" v:groupcontext="shape" transform="translate(264.485,-116.344)">			<title>Sheet.24</title>			<path d="M26.01 444.68 L0 444.68" class="st4"></path>		</g>		<g id="shape25-67" v:mid="25" v:groupcontext="shape" transform="translate(254.202,-112.615)">			<title>Sheet.25</title>			<path d="M11.19 444.68 L0 440.95 L11.19 437.29 L11.19 444.68 L11.19 444.68 Z" class="st6"></path>		</g>		<g id="shape26-69" v:mid="26" v:groupcontext="shape" transform="translate(90.8836,0)">			<title>Sheet.26</title>			<path d="M0 337.28 L0 444.68 L163.32 444.68 L163.32 337.28 L0 337.28 L0 337.28 Z" class="st7"></path>		</g>		<g id="shape27-71" v:mid="27" v:groupcontext="shape" transform="translate(131.864,-47.7376)">			<title>Sheet.27</title>			<desc>Unallocated stack</desc>			<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>			<v:textrect cx="47.988" cy="438.723" width="95.98" height="11.9064"></v:textrect>			<path d="M95.98 432.77 L0 432.77 L0 444.68 L95.98 444.68 L95.98 432.77" class="st1"></path>			<text x="8.55" y="441.7" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Unallocated stack</text>			</g>		<g id="shape28-75" v:mid="28" v:groupcontext="shape" transform="translate(90.8836,-2.98319)">			<title>Sheet.28</title>			<path d="M0 339.52 L0 444.68" class="st4"></path>		</g>		<g id="shape29-78" v:mid="29" v:groupcontext="shape" transform="translate(254.202,-2.23739)">			<title>Sheet.29</title>			<path d="M0 339.52 L0 444.68" class="st4"></path>		</g>		<g id="shape30-81" v:mid="30" v:groupcontext="shape" transform="translate(2.26831,-298.325)">			<title>Sheet.30</title>			<desc>Higher address</desc>			<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>			<v:textrect cx="44.4874" cy="438.723" width="88.98" height="11.9064"></v:textrect>			<path d="M88.97 432.77 L0 432.77 L0 444.68 L88.97 444.68 L88.97 432.77" class="st1"></path>			<text x="10.5" y="441.7" class="st2" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Higher address</text>			</g>		<g id="shape31-85" v:mid="31" v:groupcontext="shape" transform="translate(-3.9968E-14,-101.435)">			<title>Sheet.31</title>			<desc>Lower address</desc>			<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>			<v:textrect cx="43.2203" cy="438.723" width="86.45" height="11.9064"></v:textrect>			<path d="M86.44 432.77 L0 432.77 L0 444.68 L86.44 444.68 L86.44 432.77" class="st1"></path>			<text x="10.52" y="441.7" class="st2" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Lower address</text>			</g>		<g id="shape32-89" v:mid="32" v:groupcontext="shape" transform="translate(36.4442,-135.437)">			<title>Sheet.32</title>			<path d="M0 287.76 L0 444.68" class="st4"></path>		</g>		<g id="shape33-92" v:mid="33" v:groupcontext="shape" transform="translate(32.6636,-125.294)">			<title>Sheet.33</title>			<path d="M7.49 433.56 L3.78 444.68 L0 433.56 L7.49 433.56 L7.49 433.56 Z" class="st6"></path>		</g>		<g id="shape34-94" v:mid="34" v:groupcontext="shape" transform="translate(132.469,-396.77)">			<title>Sheet.34</title>			<desc>Stack in memory</desc>			<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>			<v:textrect cx="47.3448" cy="438.723" width="94.69" height="11.9064"></v:textrect>			<path d="M94.69 432.77 L0 432.77 L0 444.68 L94.69 444.68 L94.69 432.77" class="st1"></path>			<text x="9.79" y="441.7" class="st2" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Stack in memory</text>			</g>		<g id="shape35-98" v:mid="35" v:groupcontext="shape" transform="translate(90.8836,-107.395)">			<title>Sheet.35</title>			<path d="M0 364.13 L0 444.68 L163.32 444.68 L163.32 364.13 L0 364.13 L0 364.13 Z" class="st3"></path>		</g>		<g id="shape36-100" v:mid="36" v:groupcontext="shape" transform="translate(90.8836,-107.395)">			<title>Sheet.36</title>			<path d="M0 444.68 L163.32 444.68 L163.32 364.13 L0 364.13 L0 444.68 L0 444.68" class="st4"></path>		</g>		<g id="shape37-103" v:mid="37" v:groupcontext="shape" transform="translate(135.796,-147.674)">			<title>Sheet.37</title>			<desc>Procedure local</desc>			<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>			<v:textrect cx="45.1363" cy="438.723" width="90.28" height="11.9064"></v:textrect>			<path d="M90.27 432.77 L0 432.77 L0 444.68 L90.27 444.68 L90.27 432.77" class="st1"></path>			<text x="10.68" y="441.7" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Procedure local  </text>			</g>		<g id="shape38-107" v:mid="38" v:groupcontext="shape" transform="translate(140.862,-135.742)">			<title>Sheet.38</title>			<desc>data on stack</desc>			<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>			<v:textrect cx="37.8428" cy="438.723" width="75.69" height="11.9064"></v:textrect>			<path d="M75.69 432.77 L0 432.77 L0 444.68 L75.69 444.68 L75.69 432.77" class="st1"></path>			<text x="8.03" y="441.7" class="st5" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>data on stack</text>			</g>		<g id="shape1-111" v:mid="1" v:groupcontext="shape" transform="translate(724.793,59.9267) rotate(90)">			<title>Sheet.1</title>			<path d="M0 444.68 L162 444.68" class="st8"></path>		</g>		<g id="shape41-114" v:mid="41" v:groupcontext="shape" transform="translate(280.116,-253.432)">			<title>Sheet.41</title>			<desc>Stack frame</desc>			<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>			<v:textrect cx="33.8448" cy="438.723" width="67.69" height="11.9064"></v:textrect>			<path d="M67.69 432.77 L0 432.77 L0 444.68 L67.69 444.68 L67.69 432.77" class="st1"></path>			<text x="6.77" y="441.7" class="st2" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Stack frame</text>			</g>	</g>	<g id="group3-118" transform="translate(280.116,-242.182)" v:mid="3" v:groupcontext="group">		<title>Sheet.3</title>		<g id="shape39-119" v:mid="39" v:groupcontext="shape" transform="translate(18,727.353) rotate(180)">			<title>Sheet.39</title>			<path d="M0 444.68 L18 444.68" class="st8"></path>		</g>		<g id="shape40-122" v:mid="40" v:groupcontext="shape" transform="translate(18,889.353) rotate(180)">			<title>Sheet.40</title>			<path d="M0 444.68 L18 444.68" class="st8"></path>		</g>	</g></g>
</svg>

**Stack structure**

Note

The Hexagon processor supports three dedicated stack
instructions: allocframe, deallocframe, and dealloc\_return
([stack instructions](https://docs.qualcomm.com/doc/80-N2040-60/topic/software-stack.html#v79-prm-stack-instructions)).

The SP address must always remain 8-byte aligned for the stack
instructions to work properly.

## Stack frames

The stack stores stack frames, which are data structures that store
state information on the active subroutines in a program (for
example, those that were called but have not yet returned). Each
stack frame corresponds to an active subroutine in the program.

A stack frame contains the following elements:

- The local variables and data used by the subroutine
- The return address for the subroutine call (pushed from the link
register LR)
- The address of the previous stack frame allocated on the stack
(pushed from the frame pointer register FP)

The frame pointer register FP always contains the address of the
saved frame pointer in the current stack frame. It facilitates
debugging by enabling a debugger to examine the stack in memory and
easily determine the call sequence, function parameters, and so on.

Note

For leaf functions, it is often unnecessary to save FP and
LR. In this case, FP contains the frame pointer of the calling
function, not the current function.

## Stack protection

The Hexagon processor supports the following features to protect the
integrity of the software stack.

### Stack bounds checking

Stack bounds checking prevents a stack frame from being allocated
past the lower boundary of the software stack.

FRAMELIMIT is a 32-bit control register that stores a memory address
that specifies the lower bound of the memory area reserved for the
software stack. When the allocframe instruction allocates a new stack
frame, it compares the new stack pointer value in SP with the stack
bound value in FRAMELIMIT. If SP is less than FRAMELIMIT, the Hexagon
processor raises exception 0x27 ([exceptions](https://docs.qualcomm.com/doc/80-N2040-60/topic/program-flow.html#v79-prm-program-flow-exceptions)).

Note

Stack bounds checking is performed when the processor is in
User and Guest modes but not in Monitor mode.

### Stack smashing protection

Stack smashing is a technique malicious code uses to gain control
over an executing program. Malicious code causes buffer overflows to
occur in the local data of a procedure, with the goal of modifying
the subroutine return address stored in a stack frame so it points to
the malicious code instead of the intended return code.

Stack smashing protection prevents this from occurring by scrambling
the subroutine return address when a new stack frame is allocated,
and then unscrambling the return address when the frame is
deallocated. Because the value in FRAMEKEY changes regularly and
varies from device to device, it becomes difficult to precalculate a
malicious return address.

FRAMEKEY is a 32-bit control register that scrambles return addresses
stored on the stack:

- In the allocframe instruction, the 32-bit return address in link
register LR is XOR-scrambled with the value in FRAMEKEY before it is
stored in the new stack frame.
- In deallocframe and dealloc\_return, the return address loaded from
the stack frame is unscrambled with the value in FRAMEKEY before it
is stored in LR.

After a processor reset, the default value of FRAMEKEY is 0. If this
value is not changed, stack smashing protection is effectively
disabled.

Note

Each hardware thread has its own instance of the FRAMEKEY register.

## Stack registers

Stack registers

| **Register** | **Name** | **Description** | **Alias** |
| --- | --- | --- | --- |
| SP | Stack pointer | Points to topmost stack element in memory | R29 |
| FP | Frame pointer | Points to previous stack frame on stack | R30 |
| LR | Link register | Contains return address of subroutine call | R31 |
| FRAMELIMIT | Frame limit register | Contains lowest address of stack area | C16 |
| FRAMEKEY | Frame key register | Contains scrambling key for return addresses | C17 |

Note

SP, FP, and LR are aliases of three
[general registers](https://docs.qualcomm.com/doc/80-N2040-60/topic/registers.html#v79-prm-general-registers). These general registers are
conventionally dedicated for use as stack registers.

## Stack instructions

The Hexagon processor includes the allocframe and deallocframe
instructions to efficiently allocate and deallocate stack frames on
the call stack.

Stack instructions

| **Syntax** | **Operation** |
| --- | --- |
| allocframe(#u11:3) | Allocate stack frame.<br><br><br>This instruction is used after a call. It first XORs the<br>values in LR and FRAMEKEY, and pushes the resulting<br>scrambled return address and FP to the top of the stack.<br><br><br>Next, it subtracts an unsigned immediate from SP to allocate<br>room for local variables. If the resulting SP is less than<br>FRAMELIMIT, the processor raises exception 0x27. Otherwise,<br>SP is set to the new value, and FP is set to the address of<br>the old frame pointer on the stack.<br><br><br>The immediate operand as expressed in assembly syntax<br>specifies the byte offset. This value must be 8-byte<br>aligned and is extendable. The valid range is from 0 to 4GB. |
| deallocframe | Deallocate stack frame.<br><br><br>Use this instruction before a return to free a stack frame.<br>It first loads the saved FP and LR values from the address<br>at FP, and XORs the restored LR with the value in FRAMEKEY<br>to unscramble the return address. SP is pointed back to the<br>previous frame. |
| dealloc\_return | Subroutine return with stack frame deallocate.<br><br><br>Perform the deallocframe operation, and then perform<br>subroutine [return](https://docs.qualcomm.com/doc/80-N2040-60/topic/program-flow.html#v79-prm-returns) to the<br>target address loaded from LR by deallocframe. |

Note

The allocframe and deallocframe instructions load and store
the LR and FP registers on the stack as a single aligned 64-bit
register pair (LR:FP).

Last Published: Jan 16, 2025

[Previous Topic
Conditional execution](https://docs.qualcomm.com/bundle/publicresource/80-N2040-60/topics/conditional-execution.md) [Next Topic
Program flow](https://docs.qualcomm.com/bundle/publicresource/80-N2040-60/topics/program-flow.md)