Core: SIMD FirstFalse

This commit is contained in:
Mirek Fidler 2025-04-10 07:45:03 +02:00
parent 29238aedbc
commit 860777e329
4 changed files with 97 additions and 18 deletions

View file

@ -1,4 +1,4 @@
* /Users/cxl/out/CLANG.Debug.Debug_Full.Shared/SIMD_CMP 02.04.2025 12:04:20, user: cxl
* C:\upp\out\autotest\CLANGx64.Debug.Debug_Full\SIMD_CMP.exe 10.04.2025 07:43:11, user: mirek
=============== f32x4
a = 9 9 9 9
@ -12,6 +12,7 @@ b = 0 0 0 0
AllTrue(c == b) = false
AnyTrue(c == b) = false
CountTrue(c == b) = 0
FirstFalse(c == b) = 0
matches =
---
a = 9 9 9 0
@ -20,12 +21,14 @@ AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 3
FirstTrue(c == a) = 1
FirstFalse(c == a) = 0
matches = 1 2 3
b = 0 0 0 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 1
FirstTrue(c == b) = 0
FirstFalse(c == b) = 1
matches = 0
---
a = 9 9 0 0
@ -34,12 +37,14 @@ AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 2
FirstTrue(c == a) = 2
FirstFalse(c == a) = 0
matches = 2 3
b = 0 0 9 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 2
FirstTrue(c == b) = 0
FirstFalse(c == b) = 2
matches = 0 1
---
a = 9 0 0 0
@ -48,12 +53,14 @@ AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 1
FirstTrue(c == a) = 3
FirstFalse(c == a) = 0
matches = 3
b = 0 9 9 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 3
FirstTrue(c == b) = 0
FirstFalse(c == b) = 3
matches = 0 1 2
---
a = 1 2 3 4
@ -65,6 +72,7 @@ AnyTrue(a == b) = true
AnyTrue(a == c) = false
CountTrue(a == b) = 3
FirstTrue(a == b) = 1
FirstFalse(a == b) = 0
=============== i16x8
a = 9 9 9 9 9 9 9 9
c = 9 9 9 9 9 9 9 9
@ -77,6 +85,7 @@ b = 0 0 0 0 0 0 0 0
AllTrue(c == b) = false
AnyTrue(c == b) = false
CountTrue(c == b) = 0
FirstFalse(c == b) = 0
matches =
---
a = 9 9 9 9 9 9 9 0
@ -85,12 +94,14 @@ AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 7
FirstTrue(c == a) = 1
FirstFalse(c == a) = 0
matches = 1 2 3 4 5 6 7
b = 0 0 0 0 0 0 0 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 1
FirstTrue(c == b) = 0
FirstFalse(c == b) = 1
matches = 0
---
a = 9 9 9 9 9 9 0 0
@ -99,12 +110,14 @@ AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 6
FirstTrue(c == a) = 2
FirstFalse(c == a) = 0
matches = 2 3 4 5 6 7
b = 0 0 0 0 0 0 9 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 2
FirstTrue(c == b) = 0
FirstFalse(c == b) = 2
matches = 0 1
---
a = 9 9 9 9 9 0 0 0
@ -113,12 +126,14 @@ AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 5
FirstTrue(c == a) = 3
FirstFalse(c == a) = 0
matches = 3 4 5 6 7
b = 0 0 0 0 0 9 9 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 3
FirstTrue(c == b) = 0
FirstFalse(c == b) = 3
matches = 0 1 2
---
a = 9 9 9 9 0 0 0 0
@ -127,12 +142,14 @@ AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 4
FirstTrue(c == a) = 4
FirstFalse(c == a) = 0
matches = 4 5 6 7
b = 0 0 0 0 9 9 9 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 4
FirstTrue(c == b) = 0
FirstFalse(c == b) = 4
matches = 0 1 2 3
---
a = 9 9 9 0 0 0 0 0
@ -141,12 +158,14 @@ AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 3
FirstTrue(c == a) = 5
FirstFalse(c == a) = 0
matches = 5 6 7
b = 0 0 0 9 9 9 9 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 5
FirstTrue(c == b) = 0
FirstFalse(c == b) = 5
matches = 0 1 2 3 4
---
a = 9 9 0 0 0 0 0 0
@ -155,12 +174,14 @@ AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 2
FirstTrue(c == a) = 6
FirstFalse(c == a) = 0
matches = 6 7
b = 0 0 9 9 9 9 9 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 6
FirstTrue(c == b) = 0
FirstFalse(c == b) = 6
matches = 0 1 2 3 4 5
---
a = 9 0 0 0 0 0 0 0
@ -169,12 +190,14 @@ AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 1
FirstTrue(c == a) = 7
FirstFalse(c == a) = 0
matches = 7
b = 0 9 9 9 9 9 9 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 7
FirstTrue(c == b) = 0
FirstFalse(c == b) = 7
matches = 0 1 2 3 4 5 6
---
a = 1 2 3 4 5 6 7 8
@ -186,6 +209,7 @@ AnyTrue(a == b) = true
AnyTrue(a == c) = false
CountTrue(a == b) = 4
FirstTrue(a == b) = 1
FirstFalse(a == b) = 0
=============== i32x4
a = 9 9 9 9
c = 9 9 9 9
@ -198,6 +222,7 @@ b = 0 0 0 0
AllTrue(c == b) = false
AnyTrue(c == b) = false
CountTrue(c == b) = 0
FirstFalse(c == b) = 0
matches =
---
a = 9 9 9 0
@ -206,12 +231,14 @@ AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 3
FirstTrue(c == a) = 1
FirstFalse(c == a) = 0
matches = 1 2 3
b = 0 0 0 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 1
FirstTrue(c == b) = 0
FirstFalse(c == b) = 1
matches = 0
---
a = 9 9 0 0
@ -220,12 +247,14 @@ AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 2
FirstTrue(c == a) = 2
FirstFalse(c == a) = 0
matches = 2 3
b = 0 0 9 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 2
FirstTrue(c == b) = 0
FirstFalse(c == b) = 2
matches = 0 1
---
a = 9 0 0 0
@ -234,12 +263,14 @@ AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 1
FirstTrue(c == a) = 3
FirstFalse(c == a) = 0
matches = 3
b = 0 9 9 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 3
FirstTrue(c == b) = 0
FirstFalse(c == b) = 3
matches = 0 1 2
---
a = 1 2 3 4
@ -251,6 +282,7 @@ AnyTrue(a == b) = true
AnyTrue(a == c) = false
CountTrue(a == b) = 3
FirstTrue(a == b) = 1
FirstFalse(a == b) = 0
=============== i8x16
a = 9 9 9 9 . 9 9 9 9 . 9 9 9 9 . 9 9 9 9
c = 9 9 9 9 . 9 9 9 9 . 9 9 9 9 . 9 9 9 9
@ -263,6 +295,7 @@ b = 0 0 0 0 . 0 0 0 0 . 0 0 0 0 . 0 0 0 0
AllTrue(c == b) = false
AnyTrue(c == b) = false
CountTrue(c == b) = 0
FirstFalse(c == b) = 0
matches =
---
a = 9 9 9 9 . 9 9 9 9 . 9 9 9 9 . 9 9 9 0
@ -270,13 +303,15 @@ c = 9 9 9 9 . 9 9 9 9 . 9 9 9 9 . 9 9 9 9
AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 15
FirstTrue(c == a) = 1
FirstTrue(c == a) = 0
FirstFalse(c == a) = 0
matches = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
b = 0 0 0 0 . 0 0 0 0 . 0 0 0 0 . 0 0 0 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 1
FirstTrue(c == b) = 0
FirstFalse(c == b) = 1
matches = 0
---
a = 9 9 9 9 . 9 9 9 9 . 9 9 9 9 . 9 9 0 0
@ -284,13 +319,15 @@ c = 9 9 9 9 . 9 9 9 9 . 9 9 9 9 . 9 9 9 9
AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 14
FirstTrue(c == a) = 2
FirstTrue(c == a) = 1
FirstFalse(c == a) = 0
matches = 2 3 4 5 6 7 8 9 10 11 12 13 14 15
b = 0 0 0 0 . 0 0 0 0 . 0 0 0 0 . 0 0 9 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 2
FirstTrue(c == b) = 0
FirstFalse(c == b) = 2
matches = 0 1
---
a = 9 9 9 9 . 9 9 9 9 . 9 9 9 9 . 9 0 0 0
@ -298,13 +335,15 @@ c = 9 9 9 9 . 9 9 9 9 . 9 9 9 9 . 9 9 9 9
AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 13
FirstTrue(c == a) = 3
FirstTrue(c == a) = 1
FirstFalse(c == a) = 0
matches = 3 4 5 6 7 8 9 10 11 12 13 14 15
b = 0 0 0 0 . 0 0 0 0 . 0 0 0 0 . 0 9 9 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 3
FirstTrue(c == b) = 0
FirstFalse(c == b) = 3
matches = 0 1 2
---
a = 9 9 9 9 . 9 9 9 9 . 9 9 9 9 . 0 0 0 0
@ -312,13 +351,15 @@ c = 9 9 9 9 . 9 9 9 9 . 9 9 9 9 . 9 9 9 9
AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 12
FirstTrue(c == a) = 4
FirstTrue(c == a) = 2
FirstFalse(c == a) = 0
matches = 4 5 6 7 8 9 10 11 12 13 14 15
b = 0 0 0 0 . 0 0 0 0 . 0 0 0 0 . 9 9 9 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 4
FirstTrue(c == b) = 0
FirstFalse(c == b) = 4
matches = 0 1 2 3
---
a = 9 9 9 9 . 9 9 9 9 . 9 9 9 0 . 0 0 0 0
@ -326,13 +367,15 @@ c = 9 9 9 9 . 9 9 9 9 . 9 9 9 9 . 9 9 9 9
AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 11
FirstTrue(c == a) = 5
FirstTrue(c == a) = 2
FirstFalse(c == a) = 0
matches = 5 6 7 8 9 10 11 12 13 14 15
b = 0 0 0 0 . 0 0 0 0 . 0 0 0 9 . 9 9 9 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 5
FirstTrue(c == b) = 0
FirstFalse(c == b) = 5
matches = 0 1 2 3 4
---
a = 9 9 9 9 . 9 9 9 9 . 9 9 0 0 . 0 0 0 0
@ -340,13 +383,15 @@ c = 9 9 9 9 . 9 9 9 9 . 9 9 9 9 . 9 9 9 9
AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 10
FirstTrue(c == a) = 6
FirstTrue(c == a) = 3
FirstFalse(c == a) = 0
matches = 6 7 8 9 10 11 12 13 14 15
b = 0 0 0 0 . 0 0 0 0 . 0 0 9 9 . 9 9 9 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 6
FirstTrue(c == b) = 0
FirstFalse(c == b) = 6
matches = 0 1 2 3 4 5
---
a = 9 9 9 9 . 9 9 9 9 . 9 0 0 0 . 0 0 0 0
@ -354,13 +399,15 @@ c = 9 9 9 9 . 9 9 9 9 . 9 9 9 9 . 9 9 9 9
AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 9
FirstTrue(c == a) = 7
FirstTrue(c == a) = 3
FirstFalse(c == a) = 0
matches = 7 8 9 10 11 12 13 14 15
b = 0 0 0 0 . 0 0 0 0 . 0 9 9 9 . 9 9 9 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 7
FirstTrue(c == b) = 0
FirstFalse(c == b) = 7
matches = 0 1 2 3 4 5 6
---
a = 9 9 9 9 . 9 9 9 9 . 0 0 0 0 . 0 0 0 0
@ -368,13 +415,15 @@ c = 9 9 9 9 . 9 9 9 9 . 9 9 9 9 . 9 9 9 9
AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 8
FirstTrue(c == a) = 8
FirstTrue(c == a) = 4
FirstFalse(c == a) = 0
matches = 8 9 10 11 12 13 14 15
b = 0 0 0 0 . 0 0 0 0 . 9 9 9 9 . 9 9 9 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 8
FirstTrue(c == b) = 0
FirstFalse(c == b) = 8
matches = 0 1 2 3 4 5 6 7
---
a = 9 9 9 9 . 9 9 9 0 . 0 0 0 0 . 0 0 0 0
@ -382,13 +431,15 @@ c = 9 9 9 9 . 9 9 9 9 . 9 9 9 9 . 9 9 9 9
AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 7
FirstTrue(c == a) = 9
FirstTrue(c == a) = 4
FirstFalse(c == a) = 0
matches = 9 10 11 12 13 14 15
b = 0 0 0 0 . 0 0 0 9 . 9 9 9 9 . 9 9 9 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 9
FirstTrue(c == b) = 0
FirstFalse(c == b) = 9
matches = 0 1 2 3 4 5 6 7 8
---
a = 9 9 9 9 . 9 9 0 0 . 0 0 0 0 . 0 0 0 0
@ -396,13 +447,15 @@ c = 9 9 9 9 . 9 9 9 9 . 9 9 9 9 . 9 9 9 9
AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 6
FirstTrue(c == a) = 10
FirstTrue(c == a) = 5
FirstFalse(c == a) = 0
matches = 10 11 12 13 14 15
b = 0 0 0 0 . 0 0 9 9 . 9 9 9 9 . 9 9 9 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 10
FirstTrue(c == b) = 0
FirstFalse(c == b) = 10
matches = 0 1 2 3 4 5 6 7 8 9
---
a = 9 9 9 9 . 9 0 0 0 . 0 0 0 0 . 0 0 0 0
@ -410,13 +463,15 @@ c = 9 9 9 9 . 9 9 9 9 . 9 9 9 9 . 9 9 9 9
AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 5
FirstTrue(c == a) = 11
FirstTrue(c == a) = 5
FirstFalse(c == a) = 0
matches = 11 12 13 14 15
b = 0 0 0 0 . 0 9 9 9 . 9 9 9 9 . 9 9 9 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 11
FirstTrue(c == b) = 0
FirstFalse(c == b) = 11
matches = 0 1 2 3 4 5 6 7 8 9 10
---
a = 9 9 9 9 . 0 0 0 0 . 0 0 0 0 . 0 0 0 0
@ -424,13 +479,15 @@ c = 9 9 9 9 . 9 9 9 9 . 9 9 9 9 . 9 9 9 9
AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 4
FirstTrue(c == a) = 12
FirstTrue(c == a) = 6
FirstFalse(c == a) = 0
matches = 12 13 14 15
b = 0 0 0 0 . 9 9 9 9 . 9 9 9 9 . 9 9 9 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 12
FirstTrue(c == b) = 0
FirstFalse(c == b) = 12
matches = 0 1 2 3 4 5 6 7 8 9 10 11
---
a = 9 9 9 0 . 0 0 0 0 . 0 0 0 0 . 0 0 0 0
@ -438,13 +495,15 @@ c = 9 9 9 9 . 9 9 9 9 . 9 9 9 9 . 9 9 9 9
AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 3
FirstTrue(c == a) = 13
FirstTrue(c == a) = 6
FirstFalse(c == a) = 0
matches = 13 14 15
b = 0 0 0 9 . 9 9 9 9 . 9 9 9 9 . 9 9 9 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 13
FirstTrue(c == b) = 0
FirstFalse(c == b) = 13
matches = 0 1 2 3 4 5 6 7 8 9 10 11 12
---
a = 9 9 0 0 . 0 0 0 0 . 0 0 0 0 . 0 0 0 0
@ -452,13 +511,15 @@ c = 9 9 9 9 . 9 9 9 9 . 9 9 9 9 . 9 9 9 9
AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 2
FirstTrue(c == a) = 14
FirstTrue(c == a) = 7
FirstFalse(c == a) = 0
matches = 14 15
b = 0 0 9 9 . 9 9 9 9 . 9 9 9 9 . 9 9 9 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 14
FirstTrue(c == b) = 0
FirstFalse(c == b) = 14
matches = 0 1 2 3 4 5 6 7 8 9 10 11 12 13
---
a = 9 0 0 0 . 0 0 0 0 . 0 0 0 0 . 0 0 0 0
@ -466,13 +527,15 @@ c = 9 9 9 9 . 9 9 9 9 . 9 9 9 9 . 9 9 9 9
AllTrue(c == a) = false
AnyTrue(c == a) = true
CountTrue(c == a) = 1
FirstTrue(c == a) = 15
FirstTrue(c == a) = 7
FirstFalse(c == a) = 0
matches = 15
b = 0 9 9 9 . 9 9 9 9 . 9 9 9 9 . 9 9 9 9
AllTrue(c == b) = false
AnyTrue(c == b) = true
CountTrue(c == b) = 15
FirstTrue(c == b) = 0
FirstFalse(c == b) = 15
matches = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
---
a = 1 2 3 4 . 5 6 7 8 . 1 2 3 4 . 5 6 7 8
@ -483,4 +546,5 @@ AllTrue(a == a) = true
AnyTrue(a == b) = true
AnyTrue(a == c) = false
CountTrue(a == b) = 8
FirstTrue(a == b) = 1
FirstTrue(a == b) = 0
FirstFalse(a == b) = 0

View file

@ -23,6 +23,8 @@ T Test()
DDUMP(CountTrue(c == a));
if(AnyTrue(c == a))
DDUMP(FirstTrue(c == a));
if(!AllTrue(c == a))
DDUMP(FirstFalse(c == a));
String matches;
for(int j = 0; j < n; j++)
if(IsTrue(c == a, j))
@ -34,6 +36,8 @@ T Test()
DDUMP(CountTrue(c == b));
if(AnyTrue(c == b))
DDUMP(FirstTrue(c == b));
if(!AllTrue(c == b))
DDUMP(FirstFalse(c == b));
matches.Clear();
for(int j = 0; j < n; j++)
if(IsTrue(c == b, j))
@ -68,6 +72,7 @@ CONSOLE_APP_MAIN
DDUMP(AnyTrue(a == c));
DDUMP(CountTrue(a == b));
DDUMP(FirstTrue(a == b));
DDUMP(FirstFalse(a == b));
}
DLOG("=============== i16x8");
{
@ -85,6 +90,7 @@ CONSOLE_APP_MAIN
DDUMP(AnyTrue(a == c));
DDUMP(CountTrue(a == b));
DDUMP(FirstTrue(a == b));
DDUMP(FirstFalse(a == b));
}
DLOG("=============== i32x4");
{
@ -102,6 +108,7 @@ CONSOLE_APP_MAIN
DDUMP(AnyTrue(a == c));
DDUMP(CountTrue(a == b));
DDUMP(FirstTrue(a == b));
DDUMP(FirstFalse(a == b));
}
DLOG("=============== i8x16");
{
@ -119,6 +126,7 @@ CONSOLE_APP_MAIN
DDUMP(AnyTrue(a == c));
DDUMP(CountTrue(a == b));
DDUMP(FirstTrue(a == b));
DDUMP(FirstFalse(a == b));
}
CheckLogEtalon();
}

View file

@ -67,6 +67,7 @@ force_inline bool AllTrue(f32x4 a) { return cmaskf__(a.data) ==
force_inline bool AnyTrue(f32x4 a) { return cmaskf__(a.data); }
force_inline int CountTrue(f32x4 a) { return CountBits64(cmaskf__(a.data)) >> 4; }
force_inline int FirstTrue(f32x4 a) { return CountTrailingZeroBits64(cmaskf__(a.data)) >> 4; }
force_inline int FirstFalse(f32x4 a) { return CountTrailingZeroBits64(~cmaskf__(a.data)) >> 4; }
force_inline bool IsTrue(f32x4 a, int i) { return cmaskf__(a.data) & ((uint64)1 << (i << 4)); }
force_inline f32x4 min(f32x4 a, f32x4 b) { return vminq_f32(a, b); }
@ -133,6 +134,7 @@ force_inline bool AllTrue(i16x8 a) { return cmask16__(a.data) =
force_inline bool AnyTrue(i16x8 a) { return cmask16__(a.data); }
force_inline int CountTrue(i16x8 a) { return CountBits64(cmask16__(a.data)) >> 3; }
force_inline int FirstTrue(i16x8 a) { return CountTrailingZeroBits64(cmask16__(a.data)) >> 3; }
force_inline int FirstFalse(i16x8 a) { return CountTrailingZeroBits64(~cmask16__(a.data)) >> 3; }
force_inline bool IsTrue(i16x8 a, int i) { return cmask16__(a.data) & ((uint64)1 << (i << 3)); }
struct i32x4 { // 4xint32
@ -190,6 +192,7 @@ force_inline bool AllTrue(i32x4 a) { return cmask32__(a.data) =
force_inline bool AnyTrue(i32x4 a) { return cmask32__(a.data); }
force_inline int CountTrue(i32x4 a) { return CountBits64(cmask32__(a.data)) >> 4; }
force_inline int FirstTrue(i32x4 a) { return CountTrailingZeroBits64(cmask32__(a.data)) >> 4; }
force_inline int FirstFalse(i32x4 a) { return CountTrailingZeroBits64(~cmask32__(a.data)) >> 4; }
force_inline bool IsTrue(i32x4 a, int i) { return cmask32__(a.data) & ((uint64)1 << (i << 4)); }
struct i8x16 { // 16*int8
@ -247,6 +250,7 @@ force_inline bool AllTrue(i8x16 a) { return cmask8__(a.data) ==
force_inline bool AnyTrue(i8x16 a) { return cmask8__(a.data); }
force_inline int CountTrue(i8x16 a) { return CountBits64(cmask8__(a.data)) >> 2; }
force_inline int FirstTrue(i8x16 a) { return CountTrailingZeroBits64(cmask8__(a.data)) >> 2; }
force_inline int FirstFalse(i8x16 a) { return CountTrailingZeroBits64(~cmask8__(a.data)) >> 2; }
force_inline bool IsTrue(i8x16 a, int i) { return cmask8__(a.data) & ((uint64)1 << (i << 2)); }
force_inline f32x4 ToFloat(i32x4 a) { return vcvtq_f32_s32(a); }

View file

@ -41,6 +41,7 @@ force_inline bool AllTrue(f32x4 a) { return _mm_movemask_ps(a.dat
force_inline bool AnyTrue(f32x4 a) { return _mm_movemask_ps(a.data); }
force_inline int CountTrue(f32x4 a) { return CountBits(_mm_movemask_ps(a.data)); }
force_inline int FirstTrue(f32x4 a) { return CountTrailingZeroBits(_mm_movemask_ps(a.data)); }
force_inline int FirstFalse(f32x4 a) { return CountTrailingZeroBits(~_mm_movemask_ps(a.data)); }
force_inline bool IsTrue(f32x4 a, int i) { return _mm_movemask_ps(a.data) & (1 << i); }
force_inline f32x4 min(f32x4 a, f32x4 b) { return _mm_min_ps(a.data, b.data); }
@ -102,6 +103,7 @@ force_inline bool AllTrue(i16x8 a) { return _mm_movemask_epi8(a.
force_inline bool AnyTrue(i16x8 a) { return _mm_movemask_epi8(a.data); }
force_inline int CountTrue(i16x8 a) { return CountBits(_mm_movemask_epi8(a.data)) >> 1; }
force_inline int FirstTrue(i16x8 a) { return CountTrailingZeroBits(_mm_movemask_epi8(a.data)) >> 1; }
force_inline int FirstFalse(i16x8 a) { return CountTrailingZeroBits(~_mm_movemask_epi8(a.data)) >> 1; }
force_inline int IsTrue(i16x8 a, int i) { return _mm_movemask_epi8(a.data) & (1 << 2 * i); }
struct i32x4 : i16x8 { // 4xint32
@ -140,6 +142,7 @@ force_inline bool AllTrue(i32x4 a) { return _mm_movemask_epi8(a.
force_inline bool AnyTrue(i32x4 a) { return _mm_movemask_ps(_mm_castsi128_ps(a.data)); }
force_inline int CountTrue(i32x4 a) { return CountBits(_mm_movemask_ps(_mm_castsi128_ps(a.data))); }
force_inline int FirstTrue(i32x4 a) { return CountTrailingZeroBits(_mm_movemask_ps(_mm_castsi128_ps(a.data))); }
force_inline int FirstFalse(i32x4 a) { return CountTrailingZeroBits(~_mm_movemask_ps(_mm_castsi128_ps(a.data))); }
force_inline bool IsTrue(i32x4 a, int i) { return _mm_movemask_ps(_mm_castsi128_ps(a.data)) & (1 << i); }
struct i8x16 : i16x8 { // 16xint8
@ -172,7 +175,7 @@ force_inline i8x16 operator>(i8x16 a, i8x16 b) { return _mm_cmpgt_epi8(a.dat
force_inline bool AllTrue(i8x16 a) { return _mm_movemask_epi8(a.data) == 0xffff; }
force_inline bool AnyTrue(i8x16 a) { return _mm_movemask_epi8(a.data); }
force_inline int CountTrue(i8x16 a) { return CountBits(_mm_movemask_epi8(a.data)); }
force_inline int FirstTrue(i8x16 a) { return CountTrailingZeroBits(_mm_movemask_epi8(a.data)); }
force_inline int FirstFalse(i8x16 a) { return CountTrailingZeroBits(~_mm_movemask_epi8(a.data)); }
force_inline bool IsTrue(i8x16 a, int i) { return _mm_movemask_epi8(a.data) & (1 << i); }
force_inline f32x4 ToFloat(i32x4 a) { return _mm_cvtepi32_ps(a.data); }