<?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="VRSQRTS" title="VRSQRTS -- AArch32" type="instruction">
  <docvars>
    <docvar key="instr-class" value="fpsimd"/>
    <docvar key="mnemonic" value="VRSQRTS"/>
  </docvars>
  <heading>VRSQRTS</heading>
  <desc>
    <brief>
      <para>Vector Reciprocal Square Root Step</para>
    </brief>
    <authored>
      <para>Vector Reciprocal Square Root Step multiplies the elements
of one vector by the corresponding elements of another vector, subtracts
each of the products from 3.0, divides these results by 2.0, and
places the results into the elements of the destination vector.</para>
      <para>The operand and result elements are floating-point numbers.</para>
      <para>For details of the operation performed by this instruction
see <xref linkend="ARMARM_CFIJFDFG">Floating-point reciprocal estimate and step</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>
    <syntaxnotes>
      <para>Newton-Raphson iteration</para>
      <para>For details of the operation performed and how it can be used in a Newton-Raphson iteration to calculate the reciprocal of the square root of a number, see <xref linkend="ARMARM_CFIJFDFG">Floating-point reciprocal estimate and step</xref>.</para>
    </syntaxnotes>
  </desc>
  <alias_list howmany="0"/>
  <classes>
    <classesintro count="2">
      <txt>It has encodings from the following instruction sets:</txt>
      <txt> A32 (</txt>
      <a href="#iclass_a1">A1</a>
      <txt>)</txt>
      <txt> and </txt>
      <txt> T32 (</txt>
      <a href="#iclass_t1">T1</a>
      <txt>)</txt>
      <txt>.</txt>
    </classesintro>
    <iclass name="A1" oneof="2" 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="VRSQRTS"/>
      </docvars>
      <iclassintro count="2"/>
      <regdiagram form="32" psname="A32.uncond_as.advsimddp.simd3reg_same.VRSQRTS_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="1" settings="1">
          <c>1</c>
        </box>
        <box hibit="20" width="1" name="sz" usename="1">
          <c colspan="1"/>
        </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>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>1</c>
        </box>
        <box hibit="3" width="4" name="Vm" usename="1">
          <c colspan="4"/>
        </box>
      </regdiagram>
      <encoding name="VRSQRTS_A1_D" oneofinclass="2" oneof="4" 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="VRSQRTS"/>
          <docvar key="simdvectorsize" value="double"/>
        </docvars>
        <box hibit="6" width="1" name="Q">
          <c>0</c>
        </box>
        <asmtemplate><text>VRSQRTS{</text><a hover="For the &quot;A1 128-bit SIMD vector&quot; and &quot;A1 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 vectors, " link="dt_option__5">&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="VRSQRTS_A1_Q" oneofinclass="2" oneof="4" 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="VRSQRTS"/>
        </docvars>
        <box hibit="6" width="1" name="Q">
          <c>1</c>
        </box>
        <asmtemplate><text>VRSQRTS{</text><a hover="For the &quot;A1 128-bit SIMD vector&quot; and &quot;A1 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 vectors, " link="dt_option__5">&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.VRSQRTS_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 sz == '1' &amp;&amp; !IsFeatureImplemented(FEAT_FP16) then Undefined(); end;
let esize : integer{} = 32 &gt;&gt; UInt(sz);
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;</pstext></ps>
      </ps_section>
    </iclass>
    <iclass name="T1" oneof="2" 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="VRSQRTS"/>
      </docvars>
      <iclassintro count="2"/>
      <regdiagram form="16x2" psname="T32.w.cpaf.simddp.simd_3same.VRSQRTS_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="1" settings="1">
          <c>1</c>
        </box>
        <box hibit="20" width="1" name="sz" usename="1">
          <c colspan="1"/>
        </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>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>1</c>
        </box>
        <box hibit="3" width="4" name="Vm" usename="1">
          <c colspan="4"/>
        </box>
      </regdiagram>
      <encoding name="VRSQRTS_T1_D" oneofinclass="2" oneof="4" 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="VRSQRTS"/>
          <docvar key="simdvectorsize" value="double"/>
        </docvars>
        <box hibit="6" width="1" name="Q">
          <c>0</c>
        </box>
        <asmtemplate><text>VRSQRTS{</text><a hover="For the &quot;T1 128-bit SIMD vector&quot; and &quot;T1 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 vectors, " link="dt_option__5">&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="VRSQRTS_T1_Q" oneofinclass="2" oneof="4" 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="VRSQRTS"/>
        </docvars>
        <box hibit="6" width="1" name="Q">
          <c>1</c>
        </box>
        <asmtemplate><text>VRSQRTS{</text><a hover="For the &quot;T1 128-bit SIMD vector&quot; and &quot;T1 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 vectors, " link="dt_option__5">&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.VRSQRTS_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 sz == '1' &amp;&amp; !IsFeatureImplemented(FEAT_FP16) then Undefined(); end;
if sz == '1' &amp;&amp; InITBlock() then UnpredictableProcedure(); end;
let esize : integer{} = 32 &gt;&gt; UInt(sz);
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;</pstext></ps>
      </ps_section>
      <constrained_unpredictables encoding="T1" ps_block="Decode">
        <cu_case>
          <cu_cause>
            <pstext mayhavelinks="1">size == '01' &amp;&amp; InITBlock()</pstext></cu_cause>
          <cu_type constraint="Constraint_UNDEF"/>
          <arch_variants>
            <arch_variant name="ARMv8.2-A"/>
          </arch_variants>
          <cu_type>
            <cu_type_text>The instruction executes as if it passes the Condition code check.</cu_type_text>
          </cu_type>
          <cu_type>
            <cu_type_text>The instruction executes as NOP. This means it behaves as if it fails the Condition code check.</cu_type_text>
          </cu_type>
        </cu_case>
      </constrained_unpredictables>
    </iclass>
  </classes>
  <explanations scope="all">
    <explanation enclist="VRSQRTS_A1_D, VRSQRTS_A1_Q" symboldefcount="1">
      <symbol link="AL_option__3">&lt;c&gt;</symbol>
      <account encodedin="">
        <intro>
          <para>For the "A1 128-bit SIMD vector" and "A1 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="VRSQRTS_T1_D, VRSQRTS_T1_Q" symboldefcount="2">
      <symbol link="AL_option__6">&lt;c&gt;</symbol>
      <account encodedin="">
        <intro>
          <para>For the "T1 128-bit SIMD vector" and "T1 64-bit SIMD vector" variants: see <xref linkend="Babbefhf">Standard assembler syntax fields</xref>.</para>
        </intro>
      </account>
    </explanation>
    <explanation enclist="VRSQRTS_A1_D, VRSQRTS_A1_Q, VRSQRTS_T1_D, VRSQRTS_T1_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="VRSQRTS_A1_D, VRSQRTS_A1_Q, VRSQRTS_T1_D, VRSQRTS_T1_Q" symboldefcount="1">
      <symbol link="dt_option__5">&lt;dt&gt;</symbol>
      <definition encodedin="sz">
        <intro>Is the data type for the elements of the vectors, </intro>
        <table class="valuetable">
          <tgroup cols="2">
            <thead>
              <row>
                <entry class="bitfield">sz</entry>
                <entry class="symbol">&lt;dt&gt;</entry>
              </row>
            </thead>
            <tbody>
              <row>
                <entry class="bitfield">0</entry>
                <entry class="symbol">F32</entry>
              </row>
              <row>
                <entry class="bitfield">1</entry>
                <entry class="symbol">F16</entry>
              </row>
            </tbody>
          </tgroup>
        </table>
      </definition>
      <arch_variants>
        <arch_variant name="ARMv8.2-A"/>
      </arch_variants>
    </explanation>
    <explanation enclist="VRSQRTS_A1_D, VRSQRTS_T1_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="VRSQRTS_A1_D, VRSQRTS_T1_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="VRSQRTS_A1_D, VRSQRTS_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="VRSQRTS_A1_Q, VRSQRTS_T1_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="VRSQRTS_A1_Q, VRSQRTS_T1_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="VRSQRTS_A1_Q, VRSQRTS_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>
  </explanations>
  <ps_section howmany="1">
    <ps name="A32.uncond_as.advsimddp.simd3reg_same.VRSQRTS_A1_D" sections="1" secttype="Operation">
      <pstext mayhavelinks="1" section="Execute" rep_section="execute">if ConditionPassed() then
    EncodingSpecificOperations();
    CheckAdvSIMDEnabled();
    for r = 0 to regs-1 do
        for e = 0 to elements-1 do
            D(d+r)[e*:esize] = FPRSqrtStep{esize}(D(n+r)[e*:esize], D(m+r)[e*:esize]);
        end;
    end;
end;</pstext></ps>
  </ps_section>
  <timestamp>2026-03-12 12:23:09</timestamp>
  <commit_id>2025-09_rel_asl1</commit_id>
</instructionsection>
