diff --git a/autotest/SIMD_CMP/Etalon.log b/autotest/SIMD_CMP/Etalon.log index fe79cb01a..6cd6c3768 100644 --- a/autotest/SIMD_CMP/Etalon.log +++ b/autotest/SIMD_CMP/Etalon.log @@ -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 diff --git a/autotest/SIMD_CMP/SIMD_CMP.cpp b/autotest/SIMD_CMP/SIMD_CMP.cpp index 042135f34..bf5a3c58b 100644 --- a/autotest/SIMD_CMP/SIMD_CMP.cpp +++ b/autotest/SIMD_CMP/SIMD_CMP.cpp @@ -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(); } diff --git a/uppsrc/Core/SIMD_NEON.h b/uppsrc/Core/SIMD_NEON.h index bdc661b8c..288fc558b 100644 --- a/uppsrc/Core/SIMD_NEON.h +++ b/uppsrc/Core/SIMD_NEON.h @@ -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); } diff --git a/uppsrc/Core/SIMD_SSE2.h b/uppsrc/Core/SIMD_SSE2.h index 37387d793..cfd4dc2d4 100644 --- a/uppsrc/Core/SIMD_SSE2.h +++ b/uppsrc/Core/SIMD_SSE2.h @@ -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); }