<?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="VCGE_i" title="VCGE (immediate #0) -- AArch32" type="instruction">
  <docvars>
    <docvar key="instr-class" value="fpsimd"/>
    <docvar key="mnemonic" value="VCGE"/>
  </docvars>
  <heading>VCGE (immediate #0)</heading>
  <desc>
    <brief>
      <para>Vector Compare Greater Than or Equal to Zero</para>
    </brief>
    <authored>
      <para>Vector Compare Greater Than or Equal to Zero takes each element in a
vector, and compares it with zero. If it is greater than or equal to
zero, the corresponding element in the destination vector is set to
all ones. Otherwise, it is set to all zeros.</para>
      <para>The operand vector elements are the same type, and are signed integers or
floating-point numbers.
The result vector elements are fields the same size as the
operand vector elements.</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>
  </desc>
  <operationalnotes>
    <operationalnote>
      <operationalnote_content>
        <para>This instruction is a data-independent-time instruction as described in <xref linkend="ARMARM_BEIIDCEG">About the DIT bit</xref>.</para>
      </operationalnote_content>
    </operationalnote>
  </operationalnotes>
  <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="VCGE"/>
      </docvars>
      <iclassintro count="2"/>
      <regdiagram form="32" psname="A32.uncond_as.advsimddp.a_simd_mulreg.simd2reg_misc.VCGE_i_A1_D" tworows="1">
        <box hibit="31" width="9" settings="9">
          <c>1</c>
          <c>1</c>
          <c>1</c>
          <c>1</c>
          <c>0</c>
          <c>0</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" settings="2">
          <c>1</c>
          <c>1</c>
        </box>
        <box hibit="19" width="2" name="size" usename="1">
          <c colspan="2"/>
        </box>
        <box hibit="17" width="2" name="opc1" usename="1" settings="2" psbits="xx">
          <c>0</c>
          <c>1</c>
        </box>
        <box hibit="15" width="4" name="Vd" usename="1">
          <c colspan="4"/>
        </box>
        <box hibit="11" width="1" settings="1">
          <c>0</c>
        </box>
        <box hibit="10" width="1" name="F" usename="1">
          <c colspan="1"/>
        </box>
        <box hibit="9" width="3" settings="3">
          <c>0</c>
          <c>0</c>
          <c>1</c>
        </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" width="1" settings="1">
          <c>0</c>
        </box>
        <box hibit="3" width="4" name="Vm" usename="1">
          <c colspan="4"/>
        </box>
      </regdiagram>
      <encoding name="VCGE_i_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="simdvectorsize" value="double"/>
          <docvar key="mnemonic" value="VCGE"/>
        </docvars>
        <box hibit="6" width="1" name="Q">
          <c>0</c>
        </box>
        <asmtemplate><text>VCGE{</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 operands, " link="dt_option__28">&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 SIMD&amp;FP source register, encoded in the &quot;M:Vm&quot; field." link="M_Vm__2">&lt;Dm&gt;</a><text>, #0</text></asmtemplate>
      </encoding>
      <encoding name="VCGE_i_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="VCGE"/>
        </docvars>
        <box hibit="6" width="1" name="Q">
          <c>1</c>
        </box>
        <asmtemplate><text>VCGE{</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 operands, " link="dt_option__28">&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 SIMD&amp;FP source register, encoded in the &quot;M:Vm&quot; field as &lt;Qm&gt;*2." link="M_Vm__8">&lt;Qm&gt;</a><text>, #0</text></asmtemplate>
      </encoding>
      <ps_section howmany="1">
        <ps name="A32.uncond_as.advsimddp.a_simd_mulreg.simd2reg_misc.VCGE_i_A1_D" sections="1" secttype="noheading">
          <pstext mayhavelinks="1" section="Decode" rep_section="decode">if size == '11' then Undefined(); end;
if F == '1' &amp;&amp; size == '00' then Undefined(); end;
if F == '1' &amp;&amp; size == '01' &amp;&amp; !IsFeatureImplemented(FEAT_FP16) then Undefined(); end;
if Q == '1' &amp;&amp; (Vd[0] == '1' || Vm[0] == '1') then Undefined(); end;
let floating_point : boolean = (F == '1');
let esize : integer{} = 8 &lt;&lt; UInt(size);
let elements : integer = 64 DIV esize;
let d : integer = UInt(D::Vd);
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="VCGE"/>
      </docvars>
      <iclassintro count="2"/>
      <regdiagram form="16x2" psname="T32.w.cpaf.simddp.t_simd_mulreg.simd_2r_misc.VCGE_i_T1_D" tworows="1">
        <box hibit="31" width="9" settings="9">
          <c>1</c>
          <c>1</c>
          <c>1</c>
          <c>1</c>
          <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" settings="2">
          <c>1</c>
          <c>1</c>
        </box>
        <box hibit="19" width="2" name="size" usename="1">
          <c colspan="2"/>
        </box>
        <box hibit="17" width="2" name="opc1" usename="1" settings="2" psbits="xx">
          <c>0</c>
          <c>1</c>
        </box>
        <box hibit="15" width="4" name="Vd" usename="1">
          <c colspan="4"/>
        </box>
        <box hibit="11" width="1" settings="1">
          <c>0</c>
        </box>
        <box hibit="10" width="1" name="F" usename="1">
          <c colspan="1"/>
        </box>
        <box hibit="9" width="3" settings="3">
          <c>0</c>
          <c>0</c>
          <c>1</c>
        </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" width="1" settings="1">
          <c>0</c>
        </box>
        <box hibit="3" width="4" name="Vm" usename="1">
          <c colspan="4"/>
        </box>
      </regdiagram>
      <encoding name="VCGE_i_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="simdvectorsize" value="double"/>
          <docvar key="mnemonic" value="VCGE"/>
        </docvars>
        <box hibit="6" width="1" name="Q">
          <c>0</c>
        </box>
        <asmtemplate><text>VCGE{</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 operands, " link="dt_option__28">&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 SIMD&amp;FP source register, encoded in the &quot;M:Vm&quot; field." link="M_Vm__2">&lt;Dm&gt;</a><text>, #0</text></asmtemplate>
      </encoding>
      <encoding name="VCGE_i_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="VCGE"/>
        </docvars>
        <box hibit="6" width="1" name="Q">
          <c>1</c>
        </box>
        <asmtemplate><text>VCGE{</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 operands, " link="dt_option__28">&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 SIMD&amp;FP source register, encoded in the &quot;M:Vm&quot; field as &lt;Qm&gt;*2." link="M_Vm__8">&lt;Qm&gt;</a><text>, #0</text></asmtemplate>
      </encoding>
      <ps_section howmany="1">
        <ps name="T32.w.cpaf.simddp.t_simd_mulreg.simd_2r_misc.VCGE_i_T1_D" sections="1" secttype="noheading">
          <pstext mayhavelinks="1" section="Decode" rep_section="decode">if size == '11' then Undefined(); end;
if F == '1' &amp;&amp; size == '00' then Undefined(); end;
if F == '1' &amp;&amp; size == '01' &amp;&amp; !IsFeatureImplemented(FEAT_FP16) then Undefined(); end;
if F == '1' &amp;&amp; size == '01' &amp;&amp; InITBlock() then UnpredictableProcedure(); end;
if Q == '1' &amp;&amp; (Vd[0] == '1' || Vm[0] == '1') then Undefined(); end;
let floating_point : boolean = (F == '1');
let esize : integer{} = 8 &lt;&lt; UInt(size);
let elements : integer = 64 DIV esize;
let d : integer = UInt(D::Vd);
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">F == '1' &amp;&amp; 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="VCGE_i_A1_D, VCGE_i_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="VCGE_i_T1_D, VCGE_i_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="VCGE_i_A1_D, VCGE_i_A1_Q, VCGE_i_T1_D, VCGE_i_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="VCGE_i_A1_D, VCGE_i_A1_Q, VCGE_i_T1_D, VCGE_i_T1_Q" symboldefcount="1">
      <symbol link="dt_option__28">&lt;dt&gt;</symbol>
      <definition encodedin="(F :: size)">
        <intro>Is the data type for the elements of the operands, </intro>
        <table class="valuetable">
          <tgroup cols="3">
            <thead>
              <row>
                <entry class="bitfield">F</entry>
                <entry class="bitfield">size</entry>
                <entry class="symbol">&lt;dt&gt;</entry>
              </row>
            </thead>
            <tbody>
              <row>
                <entry class="bitfield">0</entry>
                <entry class="bitfield">00</entry>
                <entry class="symbol">S8</entry>
              </row>
              <row>
                <entry class="bitfield">0</entry>
                <entry class="bitfield">01</entry>
                <entry class="symbol">S16</entry>
              </row>
              <row>
                <entry class="bitfield">0</entry>
                <entry class="bitfield">10</entry>
                <entry class="symbol">S32</entry>
              </row>
              <row>
                <entry class="bitfield">1</entry>
                <entry class="bitfield">01</entry>
                <entry class="symbol">F16</entry>
              </row>
              <row>
                <entry class="bitfield">1</entry>
                <entry class="bitfield">10</entry>
                <entry class="symbol">F32</entry>
              </row>
            </tbody>
          </tgroup>
        </table>
      </definition>
      <arch_variants>
        <arch_variant name="ARMv8.2-A"/>
      </arch_variants>
    </explanation>
    <explanation enclist="VCGE_i_A1_D, VCGE_i_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="VCGE_i_A1_D, VCGE_i_T1_D" symboldefcount="1">
      <symbol link="M_Vm__2">&lt;Dm&gt;</symbol>
      <account encodedin="(M :: Vm)">
        <intro>
          <para>Is the 64-bit name of the SIMD&amp;FP source register, encoded in the "M:Vm" field.</para>
        </intro>
      </account>
    </explanation>
    <explanation enclist="VCGE_i_A1_Q, VCGE_i_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="VCGE_i_A1_Q, VCGE_i_T1_Q" symboldefcount="1">
      <symbol link="M_Vm__8">&lt;Qm&gt;</symbol>
      <account encodedin="(M :: Vm)">
        <intro>
          <para>Is the 128-bit name of the 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.a_simd_mulreg.simd2reg_misc.VCGE_i_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
            var test_passed : boolean;
            if floating_point then
                let zero : bits(esize) = FPZero{}('0');
                test_passed = FPCompareGE{esize}(D(m+r)[e*:esize], zero, StandardFPCR());
            else
                test_passed = (SInt(D(m+r)[e*:esize]) &gt;= 0);
            end;
            D(d+r)[e*:esize] = if test_passed then Ones{esize} else Zeros{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>
