[dev.simd] simd, cmd/compile: implement ToMask, unexport asMask.

This CL defines the mask semantic better:
When converting from vector to mask, its element is set to true iff
the corresponding vector element is non zero.

Change-Id: I331c1c7992dc9e81c211bdc6d73e5eb3b8414506
Reviewed-on: https://go-review.googlesource.com/c/go/+/697056
Reviewed-by: Cherry Mui <cherryyz@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
Junyang Shao 2025-08-18 19:35:53 +00:00
parent 8ccd6c2034
commit a034826e26
10 changed files with 333 additions and 181 deletions

View file

@ -33,7 +33,6 @@ func TestType(t *testing.T) {
vals := [4]int32{1, 2, 3, 4}
v := myStruct{x: simd.LoadInt32x4(&vals)}
// masking elements 1 and 2.
maskv := [4]int32{-1, -1, 0, 0}
want := []int32{2, 4, 0, 0}
y := simd.LoadInt32x4(&vals)
v.y = &y
@ -43,7 +42,7 @@ func TestType(t *testing.T) {
t.Skip("Test requires HasAVX512, not available on this hardware")
return
}
v.z = maskT(simd.LoadInt32x4(&maskv).AsMask32x4())
v.z = maskT(simd.Mask32x4FromBits(0b0011))
*v.y = v.y.AddMasked(v.x, simd.Mask32x4(v.z))
got := [4]int32{}
@ -120,18 +119,15 @@ func TestMaskConversion(t *testing.T) {
t.Skip("Test requires HasAVX512, not available on this hardware")
return
}
v := [4]int32{1, 0, 1, 0}
x := simd.LoadInt32x4(&v)
var y simd.Int32x4
mask := y.Sub(x).AsMask32x4()
v = [4]int32{5, 6, 7, 8}
y = simd.LoadInt32x4(&v)
y = y.AddMasked(x, mask)
got := [4]int32{6, 0, 8, 0}
y.Store(&v)
x := simd.LoadInt32x4Slice([]int32{5, 0, 7, 0})
mask := simd.Int32x4{}.Sub(x).ToMask()
y := simd.LoadInt32x4Slice([]int32{1, 2, 3, 4}).AddMasked(x, mask)
want := [4]int32{6, 0, 10, 0}
got := make([]int32, 4)
y.StoreSlice(got)
for i := range 4 {
if v[i] != got[i] {
t.Errorf("Result at %d incorrect: want %d, got %d", i, v[i], got[i])
if want[i] != got[i] {
t.Errorf("Result at %d incorrect: want %d, got %d", i, want[i], got[i])
}
}
}
@ -177,8 +173,7 @@ func TestCompress(t *testing.T) {
return
}
v1234 := simd.LoadInt32x4Slice([]int32{1, 2, 3, 4})
v0101 := simd.LoadInt32x4Slice([]int32{0, -1, 0, -1})
v2400 := v1234.Compress(v0101.AsMask32x4())
v2400 := v1234.Compress(simd.Mask32x4FromBits(0b1010))
got := make([]int32, 4)
v2400.StoreSlice(got)
want := []int32{2, 4, 0, 0}
@ -193,8 +188,7 @@ func TestExpand(t *testing.T) {
return
}
v3400 := simd.LoadInt32x4Slice([]int32{3, 4, 0, 0})
v0101 := simd.LoadInt32x4Slice([]int32{0, -1, 0, -1})
v2400 := v3400.Expand(v0101.AsMask32x4())
v2400 := v3400.Expand(simd.Mask32x4FromBits(0b1010))
got := make([]int32, 4)
v2400.StoreSlice(got)
want := []int32{0, 3, 0, 4}
@ -378,7 +372,7 @@ func TestBitMaskToBits(t *testing.T) {
t.Skip("Test requires HasAVX512, not available on this hardware")
return
}
if v := simd.LoadInt16x8Slice([]int16{-1, 0, -1, 0, 0, 0, 0, 0}).AsMask16x8().ToBits(); v != 0b101 {
if v := simd.LoadInt16x8Slice([]int16{1, 0, 1, 0, 0, 0, 0, 0}).ToMask().ToBits(); v != 0b101 {
t.Errorf("Want 0b101, got %b", v)
}
}