pan/bi: Model [IF]CMP_{OR,AND,MULTI} ops

Valhall-style comparisons are 3-source, allowing multiple comparisons to be
combined without bitwise arithmetic. For example, the sequence

   FCMP.f32.eq t, z, w
   FCMP_AND.f32.eq dest, x, y, t

calculates (z == w) && (y == t) in 2 instructions (would be 3 on Bifrost).

Signed-off-by: Alyssa Rosenzweig <alyssa@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17794>
This commit is contained in:
Alyssa Rosenzweig 2022-07-22 14:22:16 -04:00 committed by Marge Bot
parent d0aaf52602
commit 40bf6da4a4

View file

@ -8841,4 +8841,456 @@
<src start="0"/>
</ins>
<ins name="*FCMP_OR.f32" pseudo="true">
<src start="0" mask="0xfb"/>
<src start="3" mask="0xfb"/>
<src start="6" mask="0xfb"/>
<mod name="widen0" size="2">
<opt>none</opt>
<opt>h0</opt>
<opt>h1</opt>
</mod>
<mod name="widen1" size="2">
<opt>none</opt>
<opt>h0</opt>
<opt>h1</opt>
</mod>
<mod name="abs1" start="6" size="1" opt="abs"/>
<mod name="neg0" start="7" size="1" opt="neg"/>
<mod name="neg1" start="8" size="1" opt="neg"/>
<mod name="abs0" start="12" size="1" opt="abs"/>
<mod name="cmpf" start="13" size="3">
<opt>eq</opt>
<opt>gt</opt>
<opt>ge</opt>
<opt>ne</opt>
<opt>lt</opt>
<opt>le</opt>
<opt>gtlt</opt>
<opt>total</opt>
</mod>
<mod name="result_type" start="16" size="2" default="i1">
<opt>i1</opt>
<opt>f1</opt>
<opt>m1</opt>
</mod>
</ins>
<ins name="*FCMP_OR.v2f16" pseudo="true">
<src start="0" mask="0xfb"/>
<src start="3" mask="0xfb"/>
<src start="6" mask="0xfb"/>
<mod name="abs0" size="1" opt="abs"/>
<mod name="abs1" size="1" opt="abs"/>
<mod name="cmpf" size="3">
<opt>eq</opt>
<opt>gt</opt>
<opt>ge</opt>
<opt>ne</opt>
<opt>lt</opt>
<opt>le</opt>
<opt>gtlt</opt>
<opt>total</opt>
</mod>
<mod name="neg0" start="7" size="1" opt="neg"/>
<mod name="neg1" start="8" size="1" opt="neg"/>
<mod name="swz0" start="9" size="2" default="h01">
<opt>h00</opt>
<opt>h10</opt>
<opt>h01</opt>
<opt>h11</opt>
</mod>
<mod name="swz1" start="11" size="2" default="h01">
<opt>h00</opt>
<opt>h10</opt>
<opt>h01</opt>
<opt>h11</opt>
</mod>
<mod name="result_type" start="16" size="2" default="i1">
<opt>i1</opt>
<opt>f1</opt>
<opt>m1</opt>
</mod>
</ins>
<ins name="*FCMP_AND.f32" pseudo="true">
<src start="0" mask="0xfb"/>
<src start="3" mask="0xfb"/>
<src start="6" mask="0xfb"/>
<mod name="widen0" size="2">
<opt>none</opt>
<opt>h0</opt>
<opt>h1</opt>
</mod>
<mod name="widen1" size="2">
<opt>none</opt>
<opt>h0</opt>
<opt>h1</opt>
</mod>
<mod name="abs1" start="6" size="1" opt="abs"/>
<mod name="neg0" start="7" size="1" opt="neg"/>
<mod name="neg1" start="8" size="1" opt="neg"/>
<mod name="abs0" start="12" size="1" opt="abs"/>
<mod name="cmpf" start="13" size="3">
<opt>eq</opt>
<opt>gt</opt>
<opt>ge</opt>
<opt>ne</opt>
<opt>lt</opt>
<opt>le</opt>
<opt>gtlt</opt>
<opt>total</opt>
</mod>
<mod name="result_type" start="16" size="2" default="i1">
<opt>i1</opt>
<opt>f1</opt>
<opt>m1</opt>
</mod>
</ins>
<ins name="*FCMP_AND.v2f16" pseudo="true">
<src start="0" mask="0xfb"/>
<src start="3" mask="0xfb"/>
<src start="6" mask="0xfb"/>
<mod name="abs0" size="1" opt="abs"/>
<mod name="abs1" size="1" opt="abs"/>
<mod name="cmpf" size="3">
<opt>eq</opt>
<opt>gt</opt>
<opt>ge</opt>
<opt>ne</opt>
<opt>lt</opt>
<opt>le</opt>
<opt>gtlt</opt>
<opt>total</opt>
</mod>
<mod name="neg0" start="7" size="1" opt="neg"/>
<mod name="neg1" start="8" size="1" opt="neg"/>
<mod name="swz0" start="9" size="2" default="h01">
<opt>h00</opt>
<opt>h10</opt>
<opt>h01</opt>
<opt>h11</opt>
</mod>
<mod name="swz1" start="11" size="2" default="h01">
<opt>h00</opt>
<opt>h10</opt>
<opt>h01</opt>
<opt>h11</opt>
</mod>
<mod name="result_type" start="16" size="2" default="i1">
<opt>i1</opt>
<opt>f1</opt>
<opt>m1</opt>
</mod>
</ins>
<ins name="+ICMP_MULTI.s32" pseudo="true">
<src start="0"/>
<src start="3"/>
<src start="6"/>
<mod name="result_type" start="10" size="1" default="i1">
<opt>i1</opt>
<opt>m1</opt>
</mod>
<mod name="cmpf" size="2">
<opt>eq</opt>
<opt>ne</opt>
<opt>gt</opt>
<opt>ge</opt>
<opt>lt</opt>
<opt>le</opt>
</mod>
</ins>
<ins name="+ICMP_MULTI.u32" pseudo="true">
<src start="0"/>
<src start="3"/>
<src start="6"/>
<mod name="result_type" start="10" size="1" default="i1">
<opt>i1</opt>
<opt>m1</opt>
</mod>
<mod name="cmpf" size="2">
<opt>eq</opt>
<opt>ne</opt>
<opt>gt</opt>
<opt>ge</opt>
<opt>lt</opt>
<opt>le</opt>
</mod>
</ins>
<ins name="+ICMP_OR.s32" pseudo="true">
<src start="0"/>
<src start="3"/>
<src start="6"/>
<mod name="result_type" start="10" size="1" default="i1">
<opt>i1</opt>
<opt>m1</opt>
</mod>
<mod name="cmpf" size="2">
<opt>eq</opt>
<opt>ne</opt>
<opt>gt</opt>
<opt>ge</opt>
<opt>lt</opt>
<opt>le</opt>
</mod>
</ins>
<ins name="+ICMP_OR.u32" pseudo="true">
<src start="0"/>
<src start="3"/>
<src start="6"/>
<mod name="result_type" start="10" size="1" default="i1">
<opt>i1</opt>
<opt>m1</opt>
</mod>
<mod name="cmpf" size="2">
<opt>eq</opt>
<opt>ne</opt>
<opt>gt</opt>
<opt>ge</opt>
<opt>lt</opt>
<opt>le</opt>
</mod>
</ins>
<ins name="+ICMP_OR.v2s16" pseudo="true">
<src start="0"/>
<src start="3"/>
<src start="6"/>
<mod name="swz0" start="6" size="2" default="h01">
<opt>h00</opt>
<opt>h10</opt>
<opt>h01</opt>
<opt>h11</opt>
</mod>
<mod name="swz1" start="8" size="2" default="h01">
<opt>h00</opt>
<opt>h10</opt>
<opt>h01</opt>
<opt>h11</opt>
</mod>
<mod name="result_type" start="10" size="1" default="i1">
<opt>i1</opt>
<opt>m1</opt>
</mod>
<mod name="cmpf" size="2">
<opt>eq</opt>
<opt>ne</opt>
<opt>gt</opt>
<opt>ge</opt>
<opt>lt</opt>
<opt>le</opt>
</mod>
</ins>
<ins name="+ICMP_OR.v2u16" pseudo="true">
<src start="0"/>
<src start="3"/>
<src start="6"/>
<mod name="swz0" start="6" size="2" default="h01">
<opt>h00</opt>
<opt>h10</opt>
<opt>h01</opt>
<opt>h11</opt>
</mod>
<mod name="swz1" start="8" size="2" default="h01">
<opt>h00</opt>
<opt>h10</opt>
<opt>h01</opt>
<opt>h11</opt>
</mod>
<mod name="result_type" start="10" size="1" default="i1">
<opt>i1</opt>
<opt>m1</opt>
</mod>
<mod name="cmpf" size="2">
<opt>eq</opt>
<opt>ne</opt>
<opt>gt</opt>
<opt>ge</opt>
<opt>lt</opt>
<opt>le</opt>
</mod>
</ins>
<ins name="+ICMP_OR.v4s8" pseudo="true">
<src start="0"/>
<src start="3"/>
<src start="6"/>
<mod name="result_type" start="10" size="1" default="i1">
<opt>i1</opt>
<opt>m1</opt>
</mod>
<mod name="cmpf" size="2">
<opt>eq</opt>
<opt>ne</opt>
<opt>gt</opt>
<opt>ge</opt>
<opt>lt</opt>
<opt>le</opt>
</mod>
<derived start="6" size="1">
<eq left="cmpf" right="#gt"/>
<eq left="cmpf" right="#ge"/>
</derived>
</ins>
<ins name="+ICMP_OR.v4u8" pseudo="true">
<src start="0"/>
<src start="3"/>
<src start="6"/>
<mod name="result_type" start="10" size="1" default="i1">
<opt>i1</opt>
<opt>m1</opt>
</mod>
<mod name="cmpf" size="2">
<opt>eq</opt>
<opt>ne</opt>
<opt>gt</opt>
<opt>ge</opt>
<opt>lt</opt>
<opt>le</opt>
</mod>
</ins>
<ins name="+ICMP_AND.s32" pseudo="true">
<src start="0"/>
<src start="3"/>
<src start="6"/>
<mod name="result_type" start="10" size="1" default="i1">
<opt>i1</opt>
<opt>m1</opt>
</mod>
<mod name="cmpf" size="2">
<opt>eq</opt>
<opt>ne</opt>
<opt>gt</opt>
<opt>ge</opt>
<opt>lt</opt>
<opt>le</opt>
</mod>
</ins>
<ins name="+ICMP_AND.u32" pseudo="true">
<src start="0"/>
<src start="3"/>
<src start="6"/>
<mod name="result_type" start="10" size="1" default="i1">
<opt>i1</opt>
<opt>m1</opt>
</mod>
<mod name="cmpf" size="2">
<opt>eq</opt>
<opt>ne</opt>
<opt>gt</opt>
<opt>ge</opt>
<opt>lt</opt>
<opt>le</opt>
</mod>
</ins>
<ins name="+ICMP_AND.v2s16" pseudo="true">
<src start="0"/>
<src start="3"/>
<src start="6"/>
<mod name="swz0" start="6" size="2" default="h01">
<opt>h00</opt>
<opt>h10</opt>
<opt>h01</opt>
<opt>h11</opt>
</mod>
<mod name="swz1" start="8" size="2" default="h01">
<opt>h00</opt>
<opt>h10</opt>
<opt>h01</opt>
<opt>h11</opt>
</mod>
<mod name="result_type" start="10" size="1" default="i1">
<opt>i1</opt>
<opt>m1</opt>
</mod>
<mod name="cmpf" size="2">
<opt>eq</opt>
<opt>ne</opt>
<opt>gt</opt>
<opt>ge</opt>
<opt>lt</opt>
<opt>le</opt>
</mod>
</ins>
<ins name="+ICMP_AND.v2u16" pseudo="true">
<src start="0"/>
<src start="3"/>
<src start="6"/>
<mod name="swz0" start="6" size="2" default="h01">
<opt>h00</opt>
<opt>h10</opt>
<opt>h01</opt>
<opt>h11</opt>
</mod>
<mod name="swz1" start="8" size="2" default="h01">
<opt>h00</opt>
<opt>h10</opt>
<opt>h01</opt>
<opt>h11</opt>
</mod>
<mod name="result_type" start="10" size="1" default="i1">
<opt>i1</opt>
<opt>m1</opt>
</mod>
<mod name="cmpf" size="2">
<opt>eq</opt>
<opt>ne</opt>
<opt>gt</opt>
<opt>ge</opt>
<opt>lt</opt>
<opt>le</opt>
</mod>
</ins>
<ins name="+ICMP_AND.v4s8" pseudo="true">
<src start="0"/>
<src start="3"/>
<src start="6"/>
<mod name="result_type" start="10" size="1" default="i1">
<opt>i1</opt>
<opt>m1</opt>
</mod>
<mod name="cmpf" size="2">
<opt>eq</opt>
<opt>ne</opt>
<opt>gt</opt>
<opt>ge</opt>
<opt>lt</opt>
<opt>le</opt>
</mod>
<derived start="6" size="1">
<eq left="cmpf" right="#gt"/>
<eq left="cmpf" right="#ge"/>
</derived>
</ins>
<ins name="+ICMP_AND.v4u8" pseudo="true">
<src start="0"/>
<src start="3"/>
<src start="6"/>
<mod name="result_type" start="10" size="1" default="i1">
<opt>i1</opt>
<opt>m1</opt>
</mod>
<mod name="cmpf" size="2">
<opt>eq</opt>
<opt>ne</opt>
<opt>gt</opt>
<opt>ge</opt>
<opt>lt</opt>
<opt>le</opt>
</mod>
</ins>
</bifrost>