github.com/apache/arrow/go/v14@v14.0.1/parquet/internal/utils/bit_packing_avx2_amd64.go (about) 1 // Licensed to the Apache Software Foundation (ASF) under one 2 // or more contributor license agreements. See the NOTICE file 3 // distributed with this work for additional information 4 // regarding copyright ownership. The ASF licenses this file 5 // to you under the Apache License, Version 2.0 (the 6 // "License"); you may not use this file except in compliance 7 // with the License. You may obtain a copy of the License at 8 // 9 // http://www.apache.org/licenses/LICENSE-2.0 10 // 11 // Unless required by applicable law or agreed to in writing, software 12 // distributed under the License is distributed on an "AS IS" BASIS, 13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 // See the License for the specific language governing permissions and 15 // limitations under the License. 16 17 // +build !noasm 18 19 package utils 20 21 import ( 22 "bytes" 23 "io" 24 "sync" 25 "unsafe" 26 ) 27 28 var bufferPool = sync.Pool{New: func() interface{} { return &bytes.Buffer{} }} 29 30 //go:noescape 31 func _unpack32_avx2(in, out unsafe.Pointer, batchSize, nbits int) (num int) 32 33 func unpack32Avx2(in io.Reader, out []uint32, nbits int) int { 34 batch := len(out) / 32 * 32 35 if batch <= 0 { 36 return 0 37 } 38 39 n := batch * nbits / 8 40 41 buffer := bufferPool.Get().(*bytes.Buffer) 42 defer bufferPool.Put(buffer) 43 buffer.Reset() 44 buffer.Grow(n) 45 io.CopyN(buffer, in, int64(n)) 46 47 var ( 48 input = unsafe.Pointer(&buffer.Bytes()[0]) 49 output = unsafe.Pointer(&out[0]) 50 ) 51 52 return _unpack32_avx2(input, output, len(out), nbits) 53 }