Source file test/codegen/simd.go

     1  // asmcheck
     2  
     3  // Copyright 2025 The Go Authors. All rights reserved.
     4  // Use of this source code is governed by a BSD-style
     5  // license that can be found in the LICENSE file.
     6  
     7  // These tests check code generation of simd peephole optimizations.
     8  
     9  //go:build goexperiment.simd
    10  
    11  package codegen
    12  
    13  import "simd"
    14  
    15  func vptest1() bool {
    16  	v1 := simd.LoadUint64x2Slice([]uint64{0, 1})
    17  	v2 := simd.LoadUint64x2Slice([]uint64{0, 0})
    18  	// amd64:`VPTEST\s(.*)(.*)$`
    19  	// amd64:`SETCS\s(.*)$`
    20  	return v1.AndNot(v2).IsZero()
    21  }
    22  
    23  func vptest2() bool {
    24  	v1 := simd.LoadUint64x2Slice([]uint64{0, 1})
    25  	v2 := simd.LoadUint64x2Slice([]uint64{0, 0})
    26  	// amd64:`VPTEST\s(.*)(.*)$`
    27  	// amd64:`SETEQ\s(.*)$`
    28  	return v1.And(v2).IsZero()
    29  }
    30  
    31  type Args2 struct {
    32  	V0 simd.Uint8x32
    33  	V1 simd.Uint8x32
    34  	x  string
    35  }
    36  
    37  //go:noinline
    38  func simdStructNoSpill(a Args2) simd.Uint8x32 {
    39  	// amd64:-`VMOVDQU\s.*$`
    40  	return a.V0.Xor(a.V1)
    41  }
    42  
    43  func simdStructWrapperNoSpill(a Args2) simd.Uint8x32 {
    44  	// amd64:-`VMOVDQU\s.*$`
    45  	a.x = "test"
    46  	return simdStructNoSpill(a)
    47  }
    48  
    49  //go:noinline
    50  func simdArrayNoSpill(a [1]Args2) simd.Uint8x32 {
    51  	// amd64:-`VMOVDQU\s.*$`
    52  	return a[0].V0.Xor(a[0].V1)
    53  }
    54  
    55  func simdArrayWrapperNoSpill(a [1]Args2) simd.Uint8x32 {
    56  	// amd64:-`VMOVDQU\s.*$`
    57  	a[0].x = "test"
    58  	return simdArrayNoSpill(a)
    59  }
    60  
    61  func simdFeatureGuardedMaskOpt() simd.Int16x16 {
    62  	var x, y simd.Int16x16
    63  	if simd.X86.AVX512() {
    64  		mask := simd.Mask16x16FromBits(5)
    65  		return x.Add(y).Masked(mask) // amd64:`VPADDW.Z\s.*$`
    66  	}
    67  	mask := simd.Mask16x16FromBits(5)
    68  	return x.Add(y).Masked(mask) // amd64:`VPAND\s.*$`
    69  }
    70  
    71  func simdMaskedMerge() simd.Int16x16 {
    72  	var x, y simd.Int16x16
    73  	if simd.X86.AVX512() {
    74  		mask := simd.Mask16x16FromBits(5)
    75  		return x.Add(y).Merge(x, mask) // amd64:-`VPBLENDVB\s.*$`
    76  	}
    77  	mask := simd.Mask16x16FromBits(5)
    78  	return x.Add(y).Merge(x, mask) // amd64:`VPBLENDVB\s.*$`
    79  }
    80  

View as plain text