github.com/segmentio/parquet-go@v0.0.0-20230712180008-5d42db8f0d47/encoding/rle/rle_amd64.go (about)

     1  //go:build !purego
     2  
     3  package rle
     4  
     5  import (
     6  	"golang.org/x/sys/cpu"
     7  )
     8  
     9  var (
    10  	encodeInt32IndexEqual8Contiguous func(words [][8]int32) int
    11  	encodeInt32Bitpack               func(dst []byte, src [][8]int32, bitWidth uint) int
    12  	encodeBytesBitpack               func(dst []byte, src []uint64, bitWidth uint) int
    13  	decodeBytesBitpack               func(dst, src []byte, count, bitWidth uint)
    14  )
    15  
    16  func init() {
    17  	switch {
    18  	case cpu.X86.HasAVX2:
    19  		encodeInt32IndexEqual8Contiguous = encodeInt32IndexEqual8ContiguousAVX2
    20  		encodeInt32Bitpack = encodeInt32BitpackAVX2
    21  	default:
    22  		encodeInt32IndexEqual8Contiguous = encodeInt32IndexEqual8ContiguousSSE
    23  		encodeInt32Bitpack = encodeInt32BitpackDefault
    24  	}
    25  
    26  	switch {
    27  	case cpu.X86.HasBMI2:
    28  		encodeBytesBitpack = encodeBytesBitpackBMI2
    29  		decodeBytesBitpack = decodeBytesBitpackBMI2
    30  	default:
    31  		encodeBytesBitpack = encodeBytesBitpackDefault
    32  		decodeBytesBitpack = decodeBytesBitpackDefault
    33  	}
    34  }
    35  
    36  //go:noescape
    37  func encodeBytesBitpackBMI2(dst []byte, src []uint64, bitWidth uint) int
    38  
    39  //go:noescape
    40  func encodeInt32IndexEqual8ContiguousAVX2(words [][8]int32) int
    41  
    42  //go:noescape
    43  func encodeInt32IndexEqual8ContiguousSSE(words [][8]int32) int
    44  
    45  //go:noescape
    46  func encodeInt32Bitpack1to16bitsAVX2(dst []byte, src [][8]int32, bitWidth uint) int
    47  
    48  func encodeInt32BitpackAVX2(dst []byte, src [][8]int32, bitWidth uint) int {
    49  	switch {
    50  	case bitWidth == 0:
    51  		return 0
    52  	case bitWidth <= 16:
    53  		return encodeInt32Bitpack1to16bitsAVX2(dst, src, bitWidth)
    54  	default:
    55  		return encodeInt32BitpackDefault(dst, src, bitWidth)
    56  	}
    57  }
    58  
    59  //go:noescape
    60  func decodeBytesBitpackBMI2(dst, src []byte, count, bitWidth uint)