<?xml-stylesheet type="text/xsl" encoding="UTF-8" href="iform.xsl" version="1.0"?>
<!DOCTYPE instructionsection PUBLIC "-//ARM//DTD instructionsection //EN" "iform-p.dtd">
<!-- Copyright (c) 2010-2025 Arm Limited or its affiliates. All rights reserved. -->
<!-- This document is Non-Confidential. This document may only be used and distributed in accordance with the terms of the agreement entered into by Arm and the party that Arm delivered this document to. -->
<instructionsection id="VQDMULH" title="VQDMULH -- AArch32" type="instruction">
  <docvars>
    <docvar key="instr-class" value="fpsimd"/>
    <docvar key="mnemonic" value="VQDMULH"/>
  </docvars>
  <heading>VQDMULH</heading>
  <desc>
    <brief>
      <para>Vector Saturating Doubling Multiply Returning High Half</para>
    </brief>
    <authored>
      <para>Vector Saturating Doubling Multiply Returning High Half multiplies
corresponding elements in two vectors, doubles the results, and
places the most significant half of the final results in the
destination vector. The results are truncated, for rounded results
see <xref linkend="ARMARM_A32T32-fpsimd.instructions.VQRDMULH">VQRDMULH</xref>.</para>
      <para>The second operand can be a scalar instead of a vector. For more
information about scalars see <xref linkend="ARMARM_Cjaibjhd">Advanced SIMD
scalars</xref>.</para>
      <para>If any of the results overflow, they are saturated. The cumulative
saturation bit, <xref linkend="ARMARM_AArch32.fpscr">FPSCR</xref>.QC, is set if
saturation occurs. For details see <xref linkend="ARMARM_BEIHABGJ">Pseudocode
details of saturation</xref>.</para>
      <para>Depending on settings in the <xref linkend="ARMARM_AArch32.cpacr">CPACR</xref>,
<xref linkend="ARMARM_AArch32.nsacr">NSACR</xref>, and
<xref linkend="ARMARM_AArch32.hcptr">HCPTR</xref> registers, and the Security
state and PE mode in which the instruction is executed, an attempt to
execute the instruction might be <arm-defined-word>UNDEFINED</arm-defined-word>, or
trapped to Hyp mode.
For more information see <xref linkend="ARMARM_CIHIDDFF">Enabling Advanced
SIMD and floating-point support</xref>.</para>
    </authored>
    <encodingnotes>
      <para>Related encodings: See <xref linkend="ARMARM_T32.encoding_index.simddp">Advanced SIMD data-processing</xref> for the T32 instruction set, or <xref linkend="ARMARM_A32.encoding_index.advsimddp">Advanced SIMD data-processing</xref> for the A32 instruction set.</para>
    </encodingnotes>
  </desc>
  <alias_list howmany="0"/>
  <classes>
    <classesintro count="4">
      <txt>It has encodings from the following instruction sets:</txt>
      <txt> A32 (</txt>
      <a href="#iclass_a1">A1</a>
      <txt> and </txt>
      <a href="#iclass_a2">A2</a>
      <txt>)</txt>
      <txt> and </txt>
      <txt> T32 (</txt>
      <a href="#iclass_t1">T1</a>
      <txt> and </txt>
      <a href="#iclass_t2">T2</a>
      <txt>)</txt>
      <txt>.</txt>
    </classesintro>
    <iclass name="A1" oneof="4" id="iclass_a1" no_encodings="2" isa="A32">
      <docvars>
        <docvar key="armarmheading" value="A1"/>
        <docvar key="instr-class" value="fpsimd"/>
        <docvar key="isa" value="A32"/>
        <docvar key="mnemonic" value="VQDMULH"/>
      </docvars>
      <iclassintro count="2"/>
      <regdiagram form="32" psname="A32.uncond_as.advsimddp.simd3reg_same.VQDMULH_A1_D" tworows="1">
        <box hibit="31" width="7" settings="7">
          <c>1</c>
          <c>1</c>
          <c>1</c>
          <c>1</c>
          <c>0</c>
          <c>0</c>
          <c>1</c>
        </box>
        <box hibit="24" name="U" usename="1" settings="1" psbits="x">
          <c>0</c>
        </box>
        <box hibit="23" width="1" settings="1">
          <c>0</c>
        </box>
        <box hibit="22" width="1" name="D" usename="1">
          <c colspan="1"/>
        </box>
        <box hibit="21" width="2" name="size" usename="1">
          <c colspan="2"/>
        </box>
        <box hibit="19" width="4" name="Vn" usename="1">
          <c colspan="4"/>
        </box>
        <box hibit="15" width="4" name="Vd" usename="1">
          <c colspan="4"/>
        </box>
        <box hibit="11" width="4" name="opc" usename="1" settings="4" psbits="xxxx">
          <c>1</c>
          <c>0</c>
          <c>1</c>
          <c>1</c>
        </box>
        <box hibit="7" width="1" name="N" usename="1">
          <c colspan="1"/>
        </box>
        <box hibit="6" width="1" name="Q" usename="1">
          <c colspan="1"/>
        </box>
        <box hibit="5" width="1" name="M" usename="1">
          <c colspan="1"/>
        </box>
        <box hibit="4" name="o1" usename="1" settings="1" psbits="x">
          <c>0</c>
        </box>
        <box hibit="3" width="4" name="Vm" usename="1">
          <c colspan="4"/>
        </box>
      </regdiagram>
      <encoding name="VQDMULH_A1_D" oneofinclass="2" oneof="8" label="64-bit SIMD vector" bitdiffs="Q == 0">
        <docvars>
          <docvar key="armarmheading" value="A1"/>
          <docvar key="instr-class" value="fpsimd"/>
          <docvar key="isa" value="A32"/>
          <docvar key="mnemonic" value="VQDMULH"/>
          <docvar key="simdvectorsize" value="double"/>
        </docvars>
        <box hibit="6" width="1" name="Q">
          <c>0</c>
        </box>
        <asmtemplate><text>VQDMULH{</text><a hover="For the &quot;A1 128-bit SIMD vector&quot;, &quot;A1 64-bit SIMD vector&quot;, &quot;A2 128-bit SIMD vector&quot;, and &quot;A2 64-bit SIMD vector&quot; variants: see x[Standard assembler syntax fields](Babbefhf). This encoding must be unconditional." link="AL_option__3">&lt;c&gt;</a><text>}{</text><a hover="See x[Standard assembler syntax fields](Babbefhf)." link="qw_option">&lt;q&gt;</a><text>}.</text><a hover="Is the data type for the elements of the operands, " link="dt_option__14">&lt;dt&gt;</a><text>  {</text><a hover="Is the 64-bit name of the SIMD&amp;FP destination register, encoded in the &quot;D:Vd&quot; field." link="D_Vd">&lt;Dd&gt;</a><text>, }</text><a hover="Is the 64-bit name of the first SIMD&amp;FP source register, encoded in the &quot;N:Vn&quot; field." link="N_Vn">&lt;Dn&gt;</a><text>, </text><a hover="Is the 64-bit name of the second SIMD&amp;FP source register, encoded in the &quot;M:Vm&quot; field." link="M_Vm">&lt;Dm&gt;</a></asmtemplate>
      </encoding>
      <encoding name="VQDMULH_A1_Q" oneofinclass="2" oneof="8" label="128-bit SIMD vector" bitdiffs="Q == 1">
        <docvars>
          <docvar key="armarmheading" value="A1"/>
          <docvar key="instr-class" value="fpsimd"/>
          <docvar key="isa" value="A32"/>
          <docvar key="simdvectorsize" value="quad"/>
          <docvar key="mnemonic" value="VQDMULH"/>
        </docvars>
        <box hibit="6" width="1" name="Q">
          <c>1</c>
        </box>
        <asmtemplate><text>VQDMULH{</text><a hover="For the &quot;A1 128-bit SIMD vector&quot;, &quot;A1 64-bit SIMD vector&quot;, &quot;A2 128-bit SIMD vector&quot;, and &quot;A2 64-bit SIMD vector&quot; variants: see x[Standard assembler syntax fields](Babbefhf). This encoding must be unconditional." link="AL_option__3">&lt;c&gt;</a><text>}{</text><a hover="See x[Standard assembler syntax fields](Babbefhf)." link="qw_option">&lt;q&gt;</a><text>}.</text><a hover="Is the data type for the elements of the operands, " link="dt_option__14">&lt;dt&gt;</a><text>  {</text><a hover="Is the 128-bit name of the SIMD&amp;FP destination register, encoded in the &quot;D:Vd&quot; field as &lt;Qd&gt;*2." link="D_Vd__4">&lt;Qd&gt;</a><text>, }</text><a hover="Is the 128-bit name of the first SIMD&amp;FP source register, encoded in the &quot;N:Vn&quot; field as &lt;Qn&gt;*2." link="N_Vn__2">&lt;Qn&gt;</a><text>, </text><a hover="Is the 128-bit name of the second SIMD&amp;FP source register, encoded in the &quot;M:Vm&quot; field as &lt;Qm&gt;*2." link="M_Vm__5">&lt;Qm&gt;</a></asmtemplate>
      </encoding>
      <ps_section howmany="1">
        <ps name="A32.uncond_as.advsimddp.simd3reg_same.VQDMULH_A1_D" sections="1" secttype="noheading">
          <pstext mayhavelinks="1" section="Decode" rep_section="decode">if Q == '1' &amp;&amp; (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then Undefined(); end;
if size == '00' || size == '11' then Undefined(); end;
let scalar_form : boolean = FALSE;
let esize : integer{} = 8 &lt;&lt; UInt(size);
let elements : integer = 64 DIV esize;
let d : integer = UInt(D::Vd);
let n : integer = UInt(N::Vn);
let m : integer = UInt(M::Vm);
let regs : integer = if Q == '0' then 1 else 2;
let index : integer = ARBITRARY : integer;</pstext></ps>
      </ps_section>
    </iclass>
    <iclass name="A2" oneof="4" id="iclass_a2" no_encodings="2" isa="A32">
      <docvars>
        <docvar key="armarmheading" value="A2"/>
        <docvar key="instr-class" value="fpsimd"/>
        <docvar key="isa" value="A32"/>
        <docvar key="mnemonic" value="VQDMULH"/>
      </docvars>
      <iclassintro count="2"/>
      <regdiagram form="32" psname="A32.uncond_as.advsimddp.a_simd_mulreg.simd2reg_scalar.VQDMULH_A2_D" tworows="1">
        <box hibit="31" width="7" settings="7">
          <c>1</c>
          <c>1</c>
          <c>1</c>
          <c>1</c>
          <c>0</c>
          <c>0</c>
          <c>1</c>
        </box>
        <box hibit="24" width="1" name="Q" usename="1">
          <c colspan="1"/>
        </box>
        <box hibit="23" width="1" settings="1">
          <c>1</c>
        </box>
        <box hibit="22" width="1" name="D" usename="1">
          <c colspan="1"/>
        </box>
        <box hibit="21" width="2" name="size" usename="1" settings="2" constraint="!= 11">
          <c colspan="2">!= 11</c>
        </box>
        <box hibit="19" width="4" name="Vn" usename="1">
          <c colspan="4"/>
        </box>
        <box hibit="15" width="4" name="Vd" usename="1">
          <c colspan="4"/>
        </box>
        <box hibit="11" width="4" name="opc" usename="1" settings="4" psbits="xxxx">
          <c>1</c>
          <c>1</c>
          <c>0</c>
          <c>0</c>
        </box>
        <box hibit="7" width="1" name="N" usename="1">
          <c colspan="1"/>
        </box>
        <box hibit="6" width="1" settings="1">
          <c>1</c>
        </box>
        <box hibit="5" width="1" name="M" usename="1">
          <c colspan="1"/>
        </box>
        <box hibit="4" width="1" settings="1">
          <c>0</c>
        </box>
        <box hibit="3" width="4" name="Vm" usename="1">
          <c colspan="4"/>
        </box>
      </regdiagram>
      <encoding name="VQDMULH_A2_D" oneofinclass="2" oneof="8" label="64-bit SIMD vector" bitdiffs="Q == 0">
        <docvars>
          <docvar key="armarmheading" value="A2"/>
          <docvar key="instr-class" value="fpsimd"/>
          <docvar key="isa" value="A32"/>
          <docvar key="simdvectorsize" value="double"/>
          <docvar key="mnemonic" value="VQDMULH"/>
        </docvars>
        <box hibit="24" width="1" name="Q">
          <c>0</c>
        </box>
        <asmtemplate><text>VQDMULH{</text><a hover="For the &quot;A1 128-bit SIMD vector&quot;, &quot;A1 64-bit SIMD vector&quot;, &quot;A2 128-bit SIMD vector&quot;, and &quot;A2 64-bit SIMD vector&quot; variants: see x[Standard assembler syntax fields](Babbefhf). This encoding must be unconditional." link="AL_option__3">&lt;c&gt;</a><text>}{</text><a hover="See x[Standard assembler syntax fields](Babbefhf)." link="qw_option">&lt;q&gt;</a><text>}.</text><a hover="Is the data type for the elements of the operands, " link="dt_option__14">&lt;dt&gt;</a><text>  {</text><a hover="Is the 64-bit name of the SIMD&amp;FP destination register, encoded in the &quot;D:Vd&quot; field." link="D_Vd">&lt;Dd&gt;</a><text>, }</text><a hover="Is the 64-bit name of the first SIMD&amp;FP source register, encoded in the &quot;N:Vn&quot; field." link="N_Vn">&lt;Dn&gt;</a><text>, </text><a hover="Is the 64-bit name of the second SIMD&amp;FP source register holding the scalar. If &lt;dt&gt; is S16, Dm is restricted to D0-D7. Dm is encoded in &quot;Vm&lt;2:0&gt;&quot;, and x is encoded in &quot;M:Vm&lt;3&gt;&quot;. If &lt;dt&gt; is S32, Dm is restricted to D0-D15. Dm is encoded in &quot;Vm&quot;, and x is encoded in &quot;M&quot;." link="Dmx__4">&lt;Dm[x]&gt;</a></asmtemplate>
      </encoding>
      <encoding name="VQDMULH_A2_Q" oneofinclass="2" oneof="8" label="128-bit SIMD vector" bitdiffs="Q == 1">
        <docvars>
          <docvar key="armarmheading" value="A2"/>
          <docvar key="instr-class" value="fpsimd"/>
          <docvar key="isa" value="A32"/>
          <docvar key="simdvectorsize" value="quad"/>
          <docvar key="mnemonic" value="VQDMULH"/>
        </docvars>
        <box hibit="24" width="1" name="Q">
          <c>1</c>
        </box>
        <asmtemplate><text>VQDMULH{</text><a hover="For the &quot;A1 128-bit SIMD vector&quot;, &quot;A1 64-bit SIMD vector&quot;, &quot;A2 128-bit SIMD vector&quot;, and &quot;A2 64-bit SIMD vector&quot; variants: see x[Standard assembler syntax fields](Babbefhf). This encoding must be unconditional." link="AL_option__3">&lt;c&gt;</a><text>}{</text><a hover="See x[Standard assembler syntax fields](Babbefhf)." link="qw_option">&lt;q&gt;</a><text>}.</text><a hover="Is the data type for the elements of the operands, " link="dt_option__14">&lt;dt&gt;</a><text>  {</text><a hover="Is the 128-bit name of the SIMD&amp;FP destination register, encoded in the &quot;D:Vd&quot; field as &lt;Qd&gt;*2." link="D_Vd__4">&lt;Qd&gt;</a><text>, }</text><a hover="Is the 128-bit name of the first SIMD&amp;FP source register, encoded in the &quot;N:Vn&quot; field as &lt;Qn&gt;*2." link="N_Vn__2">&lt;Qn&gt;</a><text>, </text><a hover="Is the 64-bit name of the second SIMD&amp;FP source register holding the scalar. If &lt;dt&gt; is S16, Dm is restricted to D0-D7. Dm is encoded in &quot;Vm&lt;2:0&gt;&quot;, and x is encoded in &quot;M:Vm&lt;3&gt;&quot;. If &lt;dt&gt; is S32, Dm is restricted to D0-D15. Dm is encoded in &quot;Vm&quot;, and x is encoded in &quot;M&quot;." link="Dmx__4">&lt;Dm[x]&gt;</a></asmtemplate>
      </encoding>
      <ps_section howmany="1">
        <ps name="A32.uncond_as.advsimddp.a_simd_mulreg.simd2reg_scalar.VQDMULH_A2_D" sections="1" secttype="noheading">
          <pstext mayhavelinks="1" section="Decode" rep_section="decode">if size == '11' then See("Related encodings"); end;
if size == '00' then Undefined(); end;
if Q == '1' &amp;&amp; (Vd[0] == '1' || Vn[0] == '1') then Undefined(); end;
let scalar_form : boolean = TRUE;
let d : integer = UInt(D::Vd);
let n : integer = UInt(N::Vn);
let m : integer = if size == '01' then UInt(Vm[2:0]) else UInt(Vm);
let index : integer = if size == '01' then UInt(M::Vm[3]) else UInt(M);
let regs : integer = if Q == '0' then 1 else 2;
let esize : integer{} = 8 &lt;&lt; UInt(size);
let elements : integer = 64 DIV esize;</pstext></ps>
      </ps_section>
    </iclass>
    <iclass name="T1" oneof="4" id="iclass_t1" no_encodings="2" isa="T32">
      <docvars>
        <docvar key="armarmheading" value="T1"/>
        <docvar key="instr-class" value="fpsimd"/>
        <docvar key="isa" value="T32"/>
        <docvar key="mnemonic" value="VQDMULH"/>
      </docvars>
      <iclassintro count="2"/>
      <regdiagram form="16x2" psname="T32.w.cpaf.simddp.simd_3same.VQDMULH_T1_D" tworows="1">
        <box hibit="31" width="3" settings="3">
          <c>1</c>
          <c>1</c>
          <c>1</c>
        </box>
        <box hibit="28" name="U" usename="1" settings="1" psbits="x">
          <c>0</c>
        </box>
        <box hibit="27" width="5" settings="5">
          <c>1</c>
          <c>1</c>
          <c>1</c>
          <c>1</c>
          <c>0</c>
        </box>
        <box hibit="22" width="1" name="D" usename="1">
          <c colspan="1"/>
        </box>
        <box hibit="21" width="2" name="size" usename="1">
          <c colspan="2"/>
        </box>
        <box hibit="19" width="4" name="Vn" usename="1">
          <c colspan="4"/>
        </box>
        <box hibit="15" width="4" name="Vd" usename="1">
          <c colspan="4"/>
        </box>
        <box hibit="11" width="4" name="opc" usename="1" settings="4" psbits="xxxx">
          <c>1</c>
          <c>0</c>
          <c>1</c>
          <c>1</c>
        </box>
        <box hibit="7" width="1" name="N" usename="1">
          <c colspan="1"/>
        </box>
        <box hibit="6" width="1" name="Q" usename="1">
          <c colspan="1"/>
        </box>
        <box hibit="5" width="1" name="M" usename="1">
          <c colspan="1"/>
        </box>
        <box hibit="4" name="o1" usename="1" settings="1" psbits="x">
          <c>0</c>
        </box>
        <box hibit="3" width="4" name="Vm" usename="1">
          <c colspan="4"/>
        </box>
      </regdiagram>
      <encoding name="VQDMULH_T1_D" oneofinclass="2" oneof="8" label="64-bit SIMD vector" bitdiffs="Q == 0">
        <docvars>
          <docvar key="armarmheading" value="T1"/>
          <docvar key="instr-class" value="fpsimd"/>
          <docvar key="isa" value="T32"/>
          <docvar key="mnemonic" value="VQDMULH"/>
          <docvar key="simdvectorsize" value="double"/>
        </docvars>
        <box hibit="6" width="1" name="Q">
          <c>0</c>
        </box>
        <asmtemplate><text>VQDMULH{</text><a hover="For the &quot;T1 128-bit SIMD vector&quot;, &quot;T1 64-bit SIMD vector&quot;, &quot;T2 128-bit SIMD vector&quot;, and &quot;T2 64-bit SIMD vector&quot; variants: see x[Standard assembler syntax fields](Babbefhf)." link="AL_option__6">&lt;c&gt;</a><text>}{</text><a hover="See x[Standard assembler syntax fields](Babbefhf)." link="qw_option">&lt;q&gt;</a><text>}.</text><a hover="Is the data type for the elements of the operands, " link="dt_option__14">&lt;dt&gt;</a><text>  {</text><a hover="Is the 64-bit name of the SIMD&amp;FP destination register, encoded in the &quot;D:Vd&quot; field." link="D_Vd">&lt;Dd&gt;</a><text>, }</text><a hover="Is the 64-bit name of the first SIMD&amp;FP source register, encoded in the &quot;N:Vn&quot; field." link="N_Vn">&lt;Dn&gt;</a><text>, </text><a hover="Is the 64-bit name of the second SIMD&amp;FP source register, encoded in the &quot;M:Vm&quot; field." link="M_Vm">&lt;Dm&gt;</a></asmtemplate>
      </encoding>
      <encoding name="VQDMULH_T1_Q" oneofinclass="2" oneof="8" label="128-bit SIMD vector" bitdiffs="Q == 1">
        <docvars>
          <docvar key="armarmheading" value="T1"/>
          <docvar key="instr-class" value="fpsimd"/>
          <docvar key="isa" value="T32"/>
          <docvar key="simdvectorsize" value="quad"/>
          <docvar key="mnemonic" value="VQDMULH"/>
        </docvars>
        <box hibit="6" width="1" name="Q">
          <c>1</c>
        </box>
        <asmtemplate><text>VQDMULH{</text><a hover="For the &quot;T1 128-bit SIMD vector&quot;, &quot;T1 64-bit SIMD vector&quot;, &quot;T2 128-bit SIMD vector&quot;, and &quot;T2 64-bit SIMD vector&quot; variants: see x[Standard assembler syntax fields](Babbefhf)." link="AL_option__6">&lt;c&gt;</a><text>}{</text><a hover="See x[Standard assembler syntax fields](Babbefhf)." link="qw_option">&lt;q&gt;</a><text>}.</text><a hover="Is the data type for the elements of the operands, " link="dt_option__14">&lt;dt&gt;</a><text>  {</text><a hover="Is the 128-bit name of the SIMD&amp;FP destination register, encoded in the &quot;D:Vd&quot; field as &lt;Qd&gt;*2." link="D_Vd__4">&lt;Qd&gt;</a><text>, }</text><a hover="Is the 128-bit name of the first SIMD&amp;FP source register, encoded in the &quot;N:Vn&quot; field as &lt;Qn&gt;*2." link="N_Vn__2">&lt;Qn&gt;</a><text>, </text><a hover="Is the 128-bit name of the second SIMD&amp;FP source register, encoded in the &quot;M:Vm&quot; field as &lt;Qm&gt;*2." link="M_Vm__5">&lt;Qm&gt;</a></asmtemplate>
      </encoding>
      <ps_section howmany="1">
        <ps name="T32.w.cpaf.simddp.simd_3same.VQDMULH_T1_D" sections="1" secttype="noheading">
          <pstext mayhavelinks="1" section="Decode" rep_section="decode">if Q == '1' &amp;&amp; (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then Undefined(); end;
if size == '00' || size == '11' then Undefined(); end;
let scalar_form : boolean = FALSE;
let esize : integer{} = 8 &lt;&lt; UInt(size);
let elements : integer = 64 DIV esize;
let d : integer = UInt(D::Vd);
let n : integer = UInt(N::Vn);
let m : integer = UInt(M::Vm);
let regs : integer = if Q == '0' then 1 else 2;
let index : integer = ARBITRARY : integer;</pstext></ps>
      </ps_section>
    </iclass>
    <iclass name="T2" oneof="4" id="iclass_t2" no_encodings="2" isa="T32">
      <docvars>
        <docvar key="armarmheading" value="T2"/>
        <docvar key="instr-class" value="fpsimd"/>
        <docvar key="isa" value="T32"/>
        <docvar key="mnemonic" value="VQDMULH"/>
      </docvars>
      <iclassintro count="2"/>
      <regdiagram form="16x2" psname="T32.w.cpaf.simddp.t_simd_mulreg.simd_2r_sc.VQDMULH_T2_D" tworows="1">
        <box hibit="31" width="3" settings="3">
          <c>1</c>
          <c>1</c>
          <c>1</c>
        </box>
        <box hibit="28" width="1" name="Q" usename="1">
          <c colspan="1"/>
        </box>
        <box hibit="27" width="5" settings="5">
          <c>1</c>
          <c>1</c>
          <c>1</c>
          <c>1</c>
          <c>1</c>
        </box>
        <box hibit="22" width="1" name="D" usename="1">
          <c colspan="1"/>
        </box>
        <box hibit="21" width="2" name="size" usename="1" settings="2" constraint="!= 11">
          <c colspan="2">!= 11</c>
        </box>
        <box hibit="19" width="4" name="Vn" usename="1">
          <c colspan="4"/>
        </box>
        <box hibit="15" width="4" name="Vd" usename="1">
          <c colspan="4"/>
        </box>
        <box hibit="11" width="4" name="opc" usename="1" settings="4" psbits="xxxx">
          <c>1</c>
          <c>1</c>
          <c>0</c>
          <c>0</c>
        </box>
        <box hibit="7" width="1" name="N" usename="1">
          <c colspan="1"/>
        </box>
        <box hibit="6" width="1" settings="1">
          <c>1</c>
        </box>
        <box hibit="5" width="1" name="M" usename="1">
          <c colspan="1"/>
        </box>
        <box hibit="4" width="1" settings="1">
          <c>0</c>
        </box>
        <box hibit="3" width="4" name="Vm" usename="1">
          <c colspan="4"/>
        </box>
      </regdiagram>
      <encoding name="VQDMULH_T2_D" oneofinclass="2" oneof="8" label="64-bit SIMD vector" bitdiffs="Q == 0">
        <docvars>
          <docvar key="armarmheading" value="T2"/>
          <docvar key="instr-class" value="fpsimd"/>
          <docvar key="isa" value="T32"/>
          <docvar key="simdvectorsize" value="double"/>
          <docvar key="mnemonic" value="VQDMULH"/>
        </docvars>
        <box hibit="28" width="1" name="Q">
          <c>0</c>
        </box>
        <asmtemplate><text>VQDMULH{</text><a hover="For the &quot;T1 128-bit SIMD vector&quot;, &quot;T1 64-bit SIMD vector&quot;, &quot;T2 128-bit SIMD vector&quot;, and &quot;T2 64-bit SIMD vector&quot; variants: see x[Standard assembler syntax fields](Babbefhf)." link="AL_option__6">&lt;c&gt;</a><text>}{</text><a hover="See x[Standard assembler syntax fields](Babbefhf)." link="qw_option">&lt;q&gt;</a><text>}.</text><a hover="Is the data type for the elements of the operands, " link="dt_option__14">&lt;dt&gt;</a><text>  {</text><a hover="Is the 64-bit name of the SIMD&amp;FP destination register, encoded in the &quot;D:Vd&quot; field." link="D_Vd">&lt;Dd&gt;</a><text>, }</text><a hover="Is the 64-bit name of the first SIMD&amp;FP source register, encoded in the &quot;N:Vn&quot; field." link="N_Vn">&lt;Dn&gt;</a><text>, </text><a hover="Is the 64-bit name of the second SIMD&amp;FP source register holding the scalar. If &lt;dt&gt; is S16, Dm is restricted to D0-D7. Dm is encoded in &quot;Vm&lt;2:0&gt;&quot;, and x is encoded in &quot;M:Vm&lt;3&gt;&quot;. If &lt;dt&gt; is S32, Dm is restricted to D0-D15. Dm is encoded in &quot;Vm&quot;, and x is encoded in &quot;M&quot;." link="Dmx__4">&lt;Dm[x]&gt;</a></asmtemplate>
      </encoding>
      <encoding name="VQDMULH_T2_Q" oneofinclass="2" oneof="8" label="128-bit SIMD vector" bitdiffs="Q == 1">
        <docvars>
          <docvar key="armarmheading" value="T2"/>
          <docvar key="instr-class" value="fpsimd"/>
          <docvar key="isa" value="T32"/>
          <docvar key="simdvectorsize" value="quad"/>
          <docvar key="mnemonic" value="VQDMULH"/>
        </docvars>
        <box hibit="28" width="1" name="Q">
          <c>1</c>
        </box>
        <asmtemplate><text>VQDMULH{</text><a hover="For the &quot;T1 128-bit SIMD vector&quot;, &quot;T1 64-bit SIMD vector&quot;, &quot;T2 128-bit SIMD vector&quot;, and &quot;T2 64-bit SIMD vector&quot; variants: see x[Standard assembler syntax fields](Babbefhf)." link="AL_option__6">&lt;c&gt;</a><text>}{</text><a hover="See x[Standard assembler syntax fields](Babbefhf)." link="qw_option">&lt;q&gt;</a><text>}.</text><a hover="Is the data type for the elements of the operands, " link="dt_option__14">&lt;dt&gt;</a><text>  {</text><a hover="Is the 128-bit name of the SIMD&amp;FP destination register, encoded in the &quot;D:Vd&quot; field as &lt;Qd&gt;*2." link="D_Vd__4">&lt;Qd&gt;</a><text>, }</text><a hover="Is the 128-bit name of the first SIMD&amp;FP source register, encoded in the &quot;N:Vn&quot; field as &lt;Qn&gt;*2." link="N_Vn__2">&lt;Qn&gt;</a><text>, </text><a hover="Is the 64-bit name of the second SIMD&amp;FP source register holding the scalar. If &lt;dt&gt; is S16, Dm is restricted to D0-D7. Dm is encoded in &quot;Vm&lt;2:0&gt;&quot;, and x is encoded in &quot;M:Vm&lt;3&gt;&quot;. If &lt;dt&gt; is S32, Dm is restricted to D0-D15. Dm is encoded in &quot;Vm&quot;, and x is encoded in &quot;M&quot;." link="Dmx__4">&lt;Dm[x]&gt;</a></asmtemplate>
      </encoding>
      <ps_section howmany="1">
        <ps name="T32.w.cpaf.simddp.t_simd_mulreg.simd_2r_sc.VQDMULH_T2_D" sections="1" secttype="noheading">
          <pstext mayhavelinks="1" section="Decode" rep_section="decode">if size == '11' then See("Related encodings"); end;
if size == '00' then Undefined(); end;
if Q == '1' &amp;&amp; (Vd[0] == '1' || Vn[0] == '1') then Undefined(); end;
let scalar_form : boolean = TRUE;
let d : integer = UInt(D::Vd);
let n : integer = UInt(N::Vn);
let m : integer = if size == '01' then UInt(Vm[2:0]) else UInt(Vm);
let index : integer = if size == '01' then UInt(M::Vm[3]) else UInt(M);
let regs : integer = if Q == '0' then 1 else 2;
let esize : integer{} = 8 &lt;&lt; UInt(size);
let elements : integer = 64 DIV esize;</pstext></ps>
      </ps_section>
    </iclass>
  </classes>
  <explanations scope="all">
    <explanation enclist="VQDMULH_A1_D, VQDMULH_A1_Q, VQDMULH_A2_D, VQDMULH_A2_Q" symboldefcount="1">
      <symbol link="AL_option__3">&lt;c&gt;</symbol>
      <account encodedin="">
        <intro>
          <para>For the "A1 128-bit SIMD vector", "A1 64-bit SIMD vector", "A2 128-bit SIMD vector", and "A2 64-bit SIMD vector" variants: see <xref linkend="Babbefhf">Standard assembler syntax fields</xref>. This encoding must be unconditional.</para>
        </intro>
      </account>
    </explanation>
    <explanation enclist="VQDMULH_T1_D, VQDMULH_T1_Q, VQDMULH_T2_D, VQDMULH_T2_Q" symboldefcount="2">
      <symbol link="AL_option__6">&lt;c&gt;</symbol>
      <account encodedin="">
        <intro>
          <para>For the "T1 128-bit SIMD vector", "T1 64-bit SIMD vector", "T2 128-bit SIMD vector", and "T2 64-bit SIMD vector" variants: see <xref linkend="Babbefhf">Standard assembler syntax fields</xref>.</para>
        </intro>
      </account>
    </explanation>
    <explanation enclist="VQDMULH_A1_D, VQDMULH_A1_Q, VQDMULH_A2_D, VQDMULH_A2_Q, VQDMULH_T1_D, VQDMULH_T1_Q, VQDMULH_T2_D, VQDMULH_T2_Q" symboldefcount="1">
      <symbol link="qw_option">&lt;q&gt;</symbol>
      <account encodedin="">
        <intro>
          <para>See <xref linkend="Babbefhf">Standard assembler syntax fields</xref>.</para>
        </intro>
      </account>
    </explanation>
    <explanation enclist="VQDMULH_A1_D, VQDMULH_A1_Q, VQDMULH_A2_D, VQDMULH_A2_Q, VQDMULH_T1_D, VQDMULH_T1_Q, VQDMULH_T2_D, VQDMULH_T2_Q" symboldefcount="1">
      <symbol link="dt_option__14">&lt;dt&gt;</symbol>
      <definition encodedin="size">
        <intro>Is the data type for the elements of the operands, </intro>
        <table class="valuetable">
          <tgroup cols="2">
            <thead>
              <row>
                <entry class="bitfield">size</entry>
                <entry class="symbol">&lt;dt&gt;</entry>
              </row>
            </thead>
            <tbody>
              <row>
                <entry class="bitfield">01</entry>
                <entry class="symbol">S16</entry>
              </row>
              <row>
                <entry class="bitfield">10</entry>
                <entry class="symbol">S32</entry>
              </row>
            </tbody>
          </tgroup>
        </table>
      </definition>
    </explanation>
    <explanation enclist="VQDMULH_A1_D, VQDMULH_A2_D, VQDMULH_T1_D, VQDMULH_T2_D" symboldefcount="1">
      <symbol link="D_Vd">&lt;Dd&gt;</symbol>
      <account encodedin="(D :: Vd)">
        <intro>
          <para>Is the 64-bit name of the SIMD&amp;FP destination register, encoded in the "D:Vd" field.</para>
        </intro>
      </account>
    </explanation>
    <explanation enclist="VQDMULH_A1_D, VQDMULH_A2_D, VQDMULH_T1_D, VQDMULH_T2_D" symboldefcount="1">
      <symbol link="N_Vn">&lt;Dn&gt;</symbol>
      <account encodedin="(N :: Vn)">
        <intro>
          <para>Is the 64-bit name of the first SIMD&amp;FP source register, encoded in the "N:Vn" field.</para>
        </intro>
      </account>
    </explanation>
    <explanation enclist="VQDMULH_A1_D, VQDMULH_T1_D" symboldefcount="1">
      <symbol link="M_Vm">&lt;Dm&gt;</symbol>
      <account encodedin="(M :: Vm)">
        <intro>
          <para>Is the 64-bit name of the second SIMD&amp;FP source register, encoded in the "M:Vm" field.</para>
        </intro>
      </account>
    </explanation>
    <explanation enclist="VQDMULH_A1_Q, VQDMULH_A2_Q, VQDMULH_T1_Q, VQDMULH_T2_Q" symboldefcount="1">
      <symbol link="D_Vd__4">&lt;Qd&gt;</symbol>
      <account encodedin="(D :: Vd)">
        <intro>
          <para>Is the 128-bit name of the SIMD&amp;FP destination register, encoded in the "D:Vd" field as &lt;Qd&gt;*2.</para>
        </intro>
      </account>
    </explanation>
    <explanation enclist="VQDMULH_A1_Q, VQDMULH_A2_Q, VQDMULH_T1_Q, VQDMULH_T2_Q" symboldefcount="1">
      <symbol link="N_Vn__2">&lt;Qn&gt;</symbol>
      <account encodedin="(N :: Vn)">
        <intro>
          <para>Is the 128-bit name of the first SIMD&amp;FP source register, encoded in the "N:Vn" field as &lt;Qn&gt;*2.</para>
        </intro>
      </account>
    </explanation>
    <explanation enclist="VQDMULH_A1_Q, VQDMULH_T1_Q" symboldefcount="1">
      <symbol link="M_Vm__5">&lt;Qm&gt;</symbol>
      <account encodedin="(M :: Vm)">
        <intro>
          <para>Is the 128-bit name of the second SIMD&amp;FP source register, encoded in the "M:Vm" field as &lt;Qm&gt;*2.</para>
        </intro>
      </account>
    </explanation>
    <explanation enclist="VQDMULH_A2_D, VQDMULH_A2_Q, VQDMULH_T2_D, VQDMULH_T2_Q" symboldefcount="1">
      <symbol link="Dmx__4">&lt;Dm[x]&gt;</symbol>
      <account encodedin="(M :: Vm :: size)">
        <intro>
          <para>Is the 64-bit name of the second SIMD&amp;FP source register holding the scalar. If <syntax>&lt;dt&gt;</syntax> is <value>S16</value>, <syntax>Dm</syntax> is restricted to D0-D7. <syntax>Dm</syntax> is encoded in "Vm&lt;2:0&gt;", and <syntax>x</syntax> is encoded in "M:Vm&lt;3&gt;". If <syntax>&lt;dt&gt;</syntax> is <value>S32</value>, <syntax>Dm</syntax> is restricted to D0-D15. <syntax>Dm</syntax> is encoded in "Vm", and <syntax>x</syntax> is encoded in "M".</para>
        </intro>
      </account>
    </explanation>
  </explanations>
  <ps_section howmany="1">
    <ps name="A32.uncond_as.advsimddp.simd3reg_same.VQDMULH_A1_D" sections="1" secttype="Operation">
      <pstext mayhavelinks="1" section="Execute" rep_section="execute">if ConditionPassed() then
    EncodingSpecificOperations();
    CheckAdvSIMDEnabled();
    var op2 : integer;
    if scalar_form then op2 = SInt(D(m)[index*:esize]); end;
    for r = 0 to regs-1 do
        for e = 0 to elements-1 do
            if !scalar_form then op2 = SInt(D(m+r)[e*:esize]); end;
            let op1 : integer = SInt(D(n+r)[e*:esize]);
            // The following only saturates if both op1 and op2 equal -(2^(esize-1))
            let (result, sat) : (bits(esize), boolean) = SignedSatQ{esize}((2*op1*op2) &gt;&gt; esize);
            D(d+r)[e*:esize] = result;
            if sat then FPSCR().QC = '1'; end;
        end;
    end;
end;</pstext></ps>
  </ps_section>
  <timestamp>2026-03-12 12:23:09</timestamp>
  <commit_id>2025-09_rel_asl1</commit_id>
</instructionsection>
