# Introduction

The Qualcomm Hexagon™ processor is a general-purpose digital signal
processor designed for high performance and low power.

## Hexagon V79 processor architecture

### Memory

The Hexagon processor features a unified byte-addressable memory.
This memory has a single 32-bit virtual address space, which holds
both instructions and data. It operates in little endian mode.

The load/store architecture supports a complete set of addressing
modes for both compiler code generation and DSP application
programming.

#### Cache memory

Memory accesses are cached or uncached. Separate L1 instruction and
data caches exist for program code and data. A unified L2 cache is
partly or wholly configured as tightly coupled memory (TCM).

#### Virtual memory

Memory is addressed virtually, with virtual-to-physical translation handled by system software. Virtual memory supports the
implementation of memory management and memory protection in a
hardware-independent manner.

### Registers

The Hexagon processor has two sets of registers:
[General registers](https://docs.qualcomm.com/doc/80-N2040-60/topic/registers.html#v79-prm-general-registers) and
[Control registers](https://docs.qualcomm.com/doc/80-N2040-60/topic/registers.html#v79-prm-control-registers).

The general registers include thirty-two 32-bit registers (named R0
through R31), which are accessed either as single registers or as
aligned 64-bit register pairs. The general registers contain all
data, including pointer, scalar, vector, and accumulator data.

The control registers include special-purpose registers such as
program counter, status register, loop registers, and so on.

### Instruction sequencer

The instruction sequencer processes packets of one to four
instructions in each cycle. If a packet contains more than one
instruction, the instructions execute in parallel.

The instruction combinations allowed in a packet are limited to the
instruction types that can execute in parallel in the four execution
units (shown in [Hexagon V79 processor architecture](https://docs.qualcomm.com/doc/80-N2040-60/topic/introduction.html#fig-v79-processor-architecture)).

<?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 fig_hexagon_arch.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="6.2993in" height="6.61917in" viewbox="0 0 453.55 476.58" xml:space="preserve" color-interpolation-filters="sRGB" class="st16"><v:documentproperties v:langid="1033" v:viewmarkup="false">	<v:userdefs>		<v:ud v:nameu="msvNoAutoConnect" v:val="VT0(1):26"></v:ud>		<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: Arial; font-size: 0.75em }
.svg-1 .st3 { font-size: 1em }
.svg-1 .st4 { fill: none; stroke: #2a2aea; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.72 }
.svg-1 .st5 { stroke: #2a2aea; stroke-dasharray: 0.24, 0.48; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.24 }
.svg-1 .st6 { fill: #2a2aea; font-family: Arial; font-size: 0.75em; font-weight: bold }
.svg-1 .st7 { font-size: 1em; font-style: italic }
.svg-1 .st8 { stroke: #2a2aea; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.749723 }
.svg-1 .st9 { fill: none; stroke: #2a2aea; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.24 }
.svg-1 .st10 { font-size: 1em; font-weight: normal }
.svg-1 .st11 { marker-start: url("#mrkr13-93"); stroke: #2a2aea; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1 }
.svg-1 .st12 { fill: #2a2aea; fill-opacity: 1; stroke: #2a2aea; stroke-opacity: 1; stroke-width: 0.28409090909091 }
.svg-1 .st13 { stroke: #2a2aea; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1 }
.svg-1 .st14 { marker-end: url("#mrkr4-149"); marker-start: url("#mrkr4-147"); stroke: #2a2aea; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2.16 }
.svg-1 .st15 { fill: #2a2aea; fill-opacity: 1; stroke: #2a2aea; stroke-opacity: 1; stroke-width: 0.6 }
.svg-1 .st16 { fill: none; fill-rule: evenodd; font-size: 12px; overflow: visible; stroke-linecap: square; stroke-miterlimit: 3 }</style>
<defs id="Markers">	<g id="lend13">		<path d="M 3 1 L 0 0 L 3 -1 L 3 1 " style="stroke:none"></path>	</g>	<marker id="mrkr13-93" class="st12" v:arrowtype="13" v:arrowsize="2" v:setback="10.2" refx="10.2" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend13" transform="scale(3.52) "></use>	</marker>	<g id="lend4">		<path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"></path>	</g>	<marker id="mrkr4-147" class="st15" v:arrowtype="4" v:arrowsize="0" v:setback="3.16667" refx="3.1666666666667" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(1.6666666666667) "></use>	</marker>	<marker id="mrkr4-149" class="st15" v:arrowtype="4" v:arrowsize="0" v:setback="3.33333" refx="-3.3333333333333" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(-1.6666666666667,-1.6666666666667) "></use>	</marker></defs><g v:mid="0" v:index="1" v:groupcontext="foregroundPage">	<v:userdefs>		<v:ud v:nameu="SchemeName" v:val="VT4(Default)"></v:ud>	</v:userdefs>	<title>Page-1</title>	<v:pageproperties v:drawingscale="1" v:pagescale="1" v:drawingunits="0" v:shadowoffsetx="9" v:shadowoffsety="-9"></v:pageproperties>	<v:layer v:name="Connector" v:index="0"></v:layer>	<g id="shape3-1" v:mid="3" v:groupcontext="shape" transform="translate(76.0661,-355.855)">		<title>Sheet.3</title>		<desc>4 ´ 32 bit instructions</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="34.027" cy="465.777" width="68.06" height="21.6053"></v:textrect>		<path d="M68.05 454.97 L0 454.97 L0 476.58 L68.05 476.58 L68.05 454.97" class="st1"></path>		<text x="16.52" y="463.08" class="st2" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>4 ´ 32 bit<v:newlinechar></v:newlinechar><tspan x="11.27" dy="1.2em" class="st3">instructions</tspan></text>		</g>	<g id="shape4-6" v:mid="4" v:groupcontext="shape" transform="translate(65.6428,-343.8)">		<title>Sheet.4</title>		<path d="M2.25 471.46 L2.25 416.46 L4.5 416.46 L4.5 471.46 L2.25 471.46 L2.25 471.46 ZM6.74 470.43 L3.37 476.58 L0 470.43					 L6.74 470.43 L6.74 470.43 Z" class="st4"></path>	</g>	<g id="shape7-8" v:mid="7" v:groupcontext="shape" transform="translate(342.153,-365.222)">		<title>Sheet.7</title>		<desc>64</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="7.16294" cy="469.378" width="14.33" height="14.4035"></v:textrect>		<path d="M14.33 462.18 L0 462.18 L0 476.58 L14.33 476.58 L14.33 462.18" class="st1"></path>		<text x="2.16" y="472.08" class="st2" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>64</text>		</g>	<g id="shape9-12" v:mid="9" v:groupcontext="shape" transform="translate(363.442,-372.96)">		<title>Sheet.9</title>		<desc>64</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="10.1777" cy="469.378" width="20.36" height="14.4035"></v:textrect>		<path d="M20.36 462.18 L0 462.18 L0 476.58 L20.36 476.58 L20.36 462.18" class="st1"></path>		<text x="5.17" y="472.08" class="st2" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>64</text>		</g>	<g id="shape11-16" v:mid="11" v:groupcontext="shape" transform="translate(18.12,-404.46)">		<title>Sheet.11</title>		<desc>Memory (unified address space)</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="198" cy="449.58" width="396" height="54"></v:textrect>		<path d="M396 422.58 L0 422.58 L0 476.58 L396 476.58 L396 422.58" class="st5"></path>		<text x="180.74" y="446.88" class="st6" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Memory <v:newlinechar></v:newlinechar><tspan x="147.74" dy="1.2em" class="st3">(</tspan><tspan class="st7">unified address space</tspan>)</text>		</g>	<g id="shape12-22" v:mid="12" v:groupcontext="shape" transform="translate(63.6928,-363.96)">		<title>Sheet.12</title>		<path d="M11.99 464.58 L0 476.58" class="st8"></path>	</g>	<g id="shape13-25" v:mid="13" v:groupcontext="shape" transform="translate(36.6928,-359.46)">		<title>Sheet.13</title>		<desc>128</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="14.7151" cy="469.378" width="29.44" height="14.4035"></v:textrect>		<path d="M29.43 462.18 L0 462.18 L0 476.58 L29.43 476.58 L29.43 462.18" class="st1"></path>		<text x="7.21" y="472.08" class="st2" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>128</text>		</g>	<g id="shape14-29" v:mid="14" v:groupcontext="shape" transform="translate(332.506,-370.563)">		<title>Sheet.14</title>		<path d="M11.99 464.58 L0 476.58" class="st8"></path>	</g>	<g id="shape15-32" v:mid="15" v:groupcontext="shape" transform="translate(377.804,-369.957)">		<title>Sheet.15</title>		<path d="M11.99 464.58 L0 476.58" class="st8"></path>	</g>	<g id="shape16-35" v:mid="16" v:groupcontext="shape" transform="translate(18.12,-262.794)">		<title>Rectangle</title>		<desc>Sequencer Packets of 1 to 4 instructions</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(10):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="49.5" cy="436.08" width="99" height="81"></v:textrect>		<rect x="0" y="395.58" width="99" height="81" class="st9"></rect>		<text x="26.49" y="427.98" class="st6" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Sequencer<v:newlinechar></v:newlinechar><v:paragraph v:horizalign="1"></v:paragraph><tspan x="25.99" dy="1.2em" class="st10">  </tspan><tspan class="st10">Packets of <v:newlinechar></v:newlinechar></tspan><tspan x="14.23" dy="1.2em" class="st10">1 to 4 instructions</tspan></text>		</g>	<g id="shape17-41" v:mid="17" v:groupcontext="shape" transform="translate(189.12,-219.96)">		<title>Rectangle.11</title>		<desc>S2: X unit XTYPE instructions ALU32 instructions J instructio...</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(10):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="45" cy="440.58" width="90" height="72"></v:textrect>		<rect x="0" y="404.58" width="90" height="72" class="st9"></rect>		<text x="24.25" y="421.68" class="st6" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>S2: X unit <v:newlinechar></v:newlinechar><v:paragraph></v:paragraph><tspan x="4" dy="1.2em" class="st10">XTYPE instructions<v:newlinechar></v:newlinechar></tspan><tspan x="4" dy="1.2em" class="st10">ALU32 instructions<v:newlinechar></v:newlinechar></tspan><tspan x="4" dy="1.2em" class="st10">J instructions<v:newlinechar></v:newlinechar></tspan><tspan x="4" dy="1.2em" class="st10">JR instructions</tspan></text>		</g>	<g id="shape18-48" v:mid="18" v:groupcontext="shape" transform="translate(188.403,-304.56)">		<title>Rectangle.12</title>		<desc>S3: X unit XTYPE instructions ALU32 instructions J instructio...</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(10):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="45" cy="440.58" width="90" height="72"></v:textrect>		<rect x="0" y="404.58" width="90" height="72" class="st9"></rect>		<text x="24.25" y="421.68" class="st6" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>S3: X unit<tspan class="st10"> </tspan><tspan x="4" dy="1.2em" class="st10">XTYPE instructions<v:newlinechar></v:newlinechar></tspan><tspan x="4" dy="1.2em" class="st10">ALU32 instructions<v:newlinechar></v:newlinechar></tspan><tspan x="4" dy="1.2em" class="st10">J instructions<v:newlinechar></v:newlinechar></tspan><tspan x="4" dy="1.2em" class="st10">CR instructions</tspan></text>		</g>	<g id="shape19-56" v:mid="19" v:groupcontext="shape" transform="translate(188.403,-26.6399)">		<title>Rectangle.13</title>		<desc>S0: Load/store unit LD instructions ST instructions ALU32 ins...</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(10):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="45" cy="425.82" width="90" height="101.52"></v:textrect>		<rect x="0" y="375.06" width="90" height="101.52" class="st9"></rect>		<text x="4.25" y="385.32" class="st6" v:langid="0"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist><v:newlinechar></v:newlinechar>S0: Load/<tspan class="st3" v:langid="1033">s</tspan>tore <tspan class="st3" v:langid="1033">u</tspan>nit<v:newlinechar></v:newlinechar><v:paragraph></v:paragraph><tspan x="4" dy="1.2em" class="st10" v:langid="1033">LD instructions<v:newlinechar></v:newlinechar></tspan><tspan x="4" dy="1.2em" class="st10" v:langid="1033">ST instructions<v:newlinechar></v:newlinechar></tspan><tspan x="4" dy="1.2em" class="st10" v:langid="1033">ALU32 instructions<v:newlinechar></v:newlinechar></tspan><tspan x="4" dy="1.2em" class="st10" v:langid="1033">MEMOP </tspan><tspan x="4" dy="1.2em" class="st10" v:langid="1033">instructions<v:lf></v:lf></tspan><tspan x="4" dy="1.2em" class="st10" v:langid="1033">NV instructions<v:newlinechar></v:newlinechar></tspan><tspan x="4" dy="1.2em" class="st10" v:langid="1033">SYSTEM </tspan><tspan x="4" dy="1.2em" class="st10" v:langid="1033">instructions</tspan><v:newlinechar></v:newlinechar></text>		</g>	<g id="shape20-69" v:mid="20" v:groupcontext="shape" transform="translate(189.12,-138.96)">		<title>Rectangle.14</title>		<desc>S1: Load/store unit LD instructions ST instructions ALU32 ins...</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(10):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="45" cy="440.58" width="90" height="72"></v:textrect>		<rect x="0" y="404.58" width="90" height="72" class="st9"></rect>		<text x="4.25" y="421.68" class="st6" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>S1: <tspan class="st3" v:langid="0">Load/</tspan>s<tspan class="st3" v:langid="0">tore </tspan>u<tspan class="st3" v:langid="0">nit<v:newlinechar></v:newlinechar><v:paragraph></v:paragraph></tspan><tspan x="4" dy="1.2em" class="st10">LD instructions<v:lf></v:lf></tspan><tspan x="4" dy="1.2em" class="st10">ST instructions<v:newlinechar></v:newlinechar></tspan><tspan x="4" dy="1.2em" class="st10">ALU32 instructions</tspan><v:newlinechar></v:newlinechar></text>		</g>	<g id="shape21-78" v:mid="21" v:groupcontext="shape" transform="translate(306.843,-40.3199)">		<title>Rectangle.4</title>		<desc>General registers R0 to R31</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(10):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="54" cy="319.26" width="108" height="314.64"></v:textrect>		<rect x="0" y="161.94" width="108" height="314.64" class="st9"></rect>		<text x="16.98" y="305.76" class="st6" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>General registers<v:lf></v:lf><v:newlinechar></v:newlinechar><tspan x="33.74" dy="2.4em" class="st10">R0 to R31</tspan><v:newlinechar></v:newlinechar></text>		</g>	<g id="shape22-82" v:mid="22" v:groupcontext="shape" transform="translate(278.763,-320.04)">		<title>60 degree double</title>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(10):26"></v:ud>		</v:userdefs>		<path d="M0 467.58 L5.2 458.58 L5.2 464.52 L22.88 464.52 L22.88 458.58 L28.08 467.58 L22.88 476.58 L22.88 470.64 L5.2					 470.64 L5.2 476.58 L0 467.58 Z" class="st9"></path>	</g>	<g id="shape23-84" v:mid="23" v:groupcontext="shape" transform="translate(279.84,-246.96)">		<title>60 degree double.6</title>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(10):26"></v:ud>		</v:userdefs>		<path d="M0 467.58 L5.2 458.58 L5.2 464.52 L21.8 464.52 L21.8 458.58 L27 467.58 L21.8 476.58 L21.8 470.64 L5.2 470.64					 L5.2 476.58 L0 467.58 Z" class="st9"></path>	</g>	<g id="shape24-86" v:mid="24" v:groupcontext="shape" transform="translate(279.12,-164.16)">		<title>60 degree double.7</title>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(10):26"></v:ud>		</v:userdefs>		<path d="M0 467.58 L5.2 458.58 L5.2 464.52 L22.17 464.52 L22.17 458.58 L27.36 467.58 L22.17 476.58 L22.17 470.64 L5.2					 470.64 L5.2 476.58 L0 467.58 Z" class="st9"></path>	</g>	<g id="shape26-88" v:mid="26" v:groupcontext="shape" transform="translate(144.843,-254.88)">		<title>Sheet.26</title>		<path d="M34.08 476.58 L33.72 476.58 L16.31 476.58 L16.31 420.42 L0 420.42" class="st11"></path>	</g>	<g id="shape27-94" v:mid="27" v:groupcontext="shape" transform="translate(130.62,-172.08)">		<title>Sheet.27</title>		<path d="M48.3 476.58 L47.94 476.58 L21.55 476.58 L21.55 354.37 L0 354.37" class="st11"></path>	</g>	<g id="shape28-99" v:mid="28" v:groupcontext="shape" transform="translate(117.12,-81.3599)">		<title>Sheet.28</title>		<path d="M61.8 476.58 L61.44 476.58 L26.53 476.58 L26.53 281.65 L0 281.65" class="st11"></path>	</g>	<g id="shape29-104" v:mid="29" v:groupcontext="shape" transform="translate(117.12,-326.334)">		<title>Sheet.29</title>		<path d="M61.8 476.58 L61.44 476.58 L26.53 476.58 L0 476.58" class="st11"></path>	</g>	<g id="shape31-109" v:mid="31" v:groupcontext="shape" transform="translate(144.12,658.866) rotate(180)">		<title>Sheet.31</title>		<path d="M0 476.58 L27 476.58" class="st13"></path>	</g>	<g id="shape32-112" v:mid="32" v:groupcontext="shape" transform="translate(18.12,-109.44)">		<title>Rectangle.16</title>		<desc>Control registers Hardware loop registers Modifier registers ...</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(10):26"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="54" cy="417.903" width="108" height="117.354"></v:textrect>		<rect x="0" y="359.226" width="108" height="117.354" class="st9"></rect>		<text x="17.74" y="372" class="st6" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Control registers<v:newlinechar></v:newlinechar><v:paragraph></v:paragraph><tspan x="4" dy="1.2em" class="st10">  </tspan><tspan class="st10">Hardware loop </tspan><tspan x="4" dy="1.2em" class="st10">registers<v:newlinechar></v:newlinechar></tspan><tspan x="4" dy="1.2em" class="st10">  </tspan><tspan class="st10">Modifier registers <v:newlinechar></v:newlinechar></tspan><tspan x="4" dy="1.2em" class="st10">  </tspan><tspan class="st10">Status register<v:newlinechar></v:newlinechar></tspan><tspan x="4" dy="1.2em" class="st10">  </tspan><tspan class="st10">Program counter<v:newlinechar></v:newlinechar></tspan><tspan x="4" dy="1.2em" class="st10">  </tspan><tspan class="st10">Predicate registers<v:newlinechar></v:newlinechar></tspan><tspan x="4" dy="1.2em" class="st10">  </tspan><tspan class="st10">User general pointer<v:newlinechar></v:newlinechar></tspan><tspan x="4" dy="1.2em" class="st10">  </tspan><tspan class="st10">Global pointer<v:newlinechar></v:newlinechar></tspan><tspan x="4" dy="1.2em" class="st10">  </tspan><tspan class="st10">Circular start registers</tspan></text>		</g>	<g id="shape25-132" v:mid="25" v:groupcontext="shape" transform="translate(278.583,-74.4299)">		<title>60 degree double.25</title>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(10):26"></v:ud>		</v:userdefs>		<path d="M0 467.58 L5.2 458.58 L5.2 464.52 L22.88 464.52 L22.88 458.58 L28.08 467.58 L22.88 476.58 L22.88 470.64 L5.2					 470.64 L5.2 476.58 L0 467.58 Z" class="st9"></path>	</g>	<g id="shape33-134" v:mid="33" v:groupcontext="shape" transform="translate(150.027,642.12) rotate(180)">		<title>Sheet.33</title>		<path d="M0 476.58 L32.54 476.58" class="st13"></path>	</g>	<g id="shape1-137" v:mid="1" v:groupcontext="shape" transform="translate(287.01,-368.637)">		<title>Sheet.1</title>		<desc>Load/store</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="23.0728" cy="465.777" width="46.15" height="21.6053"></v:textrect>		<path d="M46.15 454.97 L0 454.97 L0 476.58 L46.15 476.58 L46.15 454.97" class="st1"></path>		<text x="1.81" y="468.48" class="st2" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Load/store</text>		</g>	<g id="shape2-141" v:mid="2" v:groupcontext="shape" v:layermember="0" transform="translate(345.723,-405.127)">		<title>Dynamic connector</title>		<path d="M-7.2 483.42 L-7.2 483.78 L-7.2 519.31" class="st14"></path>	</g>	<g id="shape5-150" v:mid="5" v:groupcontext="shape" v:layermember="0" transform="translate(376.143,-404.407)">		<title>Dynamic connector.5</title>		<path d="M7.2 483.42 L7.2 483.78 L7.2 519.31" class="st14"></path>	</g>	<g id="shape34-157" v:mid="34" v:groupcontext="shape" transform="translate(390.363,-368.64)">		<title>Sheet.34</title>		<desc>Load/store</desc>		<v:textblock v:margins="rect(0,0,0,0)"></v:textblock>		<v:textrect cx="22.5936" cy="465.777" width="45.19" height="21.6053"></v:textrect>		<path d="M45.19 454.97 L0 454.97 L0 476.58 L45.19 476.58 L45.19 454.97" class="st1"></path>		<text x="1.33" y="468.48" class="st2" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Load/store</text>		</g></g>
</svg>

**Hexagon V79 processor architecture**

### Execution units

The two execution units (X units) are identical. Each includes a 64-bit
shifter and a vector multiply/accumulate unit with four 16 x 16
multipliers to support both scalar and vector instructions.

These units also perform 32-bit and 64-bit ALU instructions, as well as jump
and loop instructions.

Note

Each execution unit supports floating-point instructions.

### Load/store units

The two load/store units can operate on bytes (8-bit),
halfwords (16-bit), words (32- bit), or double words (64-bit).

To increase the number of instruction combinations allowed in
packets, the load units also support 32-bit ALU instructions.

## Instruction set

For the Hexagon processor to achieve large amounts of work per cycle,
the instruction set has the following properties:

- Static grouping (VLIW) architecture
- Static fusing of simple dependent instructions
- Extensive compound instructions
- A large set of SIMD and application-specific instructions

To support efficient compilation, the instruction set is orthogonal
with respect to registers, addressing modes, and load/store access
size.

### Addressing modes

The Hexagon processor supports the following memory addressing modes:

- 32-bit absolute
- 32-bit absolute-assign
- Absolute with register offset
- Global pointer relative
- Indirect
- Indirect with offset
- Indirect with register offset
- Indirect with auto-increment (immediate or register)
- Circular with auto-increment (immediate or register)
- Bit-reversed with auto-increment register

For example:

R2 = memw(##myvariable)
    R2 = memw(R3=##myvariable)
    R2 = memw(R4<<#3+##myvariable)
    R2 = memw(GP+#200)
    R2 = memw(R1)
    R2 = memw(R3+#100)
    R2 = memw(R3+R4<<#2)
    R2 = memw(R3++#4)
    R2 = memw(R0++M1)
    R0 = memw(R2++#8:circ(M0))
    R0 = memw(R2++I:circ(M0))
    R2 = memw(R0++M1:brev)
    Copy to clipboard

Auto-increment with register addressing uses one of the two dedicated
address-modify registers M0 and M1 (which are part of the control registers).

### Program flow

The Hexagon processor supports zero-overhead hardware loops. For
example:

loop0(start,#3)         // loop 3 times
    start:
       { R0 = mpyi(R0,R0) } :endloop0
    Copy to clipboard

The loop instructions support loop nesting, with few restrictions
on their use.

Software branches may use a predicated branch mechanism. Explicit compare
instructions generate a predicate bit, which conditional branch
instructions then test. For example:

P1 = cmp.eq(R2, R3)
    if (P1) jump end
    if (!P1) call function
    Copy to clipboard

Jumps and subroutine calls are conditional or unconditional, and
support both PC-relative and register indirect addressing modes. For
example:

jump end // PC-relative
    jumpr R1 // register indirect
    call function
    callr R2
    Copy to clipboard

The subroutine call instructions store the return address in register
R31. Subroutine returns are performed using a jump indirect
instruction through this register. For example:

jumpr R31    // Subroutine return
    Copy to clipboard

Two program flow instructions can be grouped into one packet.

### Instruction pipeline

Pipeline restrictions do not constrain instruction scheduling. The hardware resolves pipeline hazards.

Last Published: Jan 16, 2025

[Next Topic
Revision history](https://docs.qualcomm.com/bundle/publicresource/80-N2040-60/topics/revision.md)