github.com/apache/arrow/go/v14@v14.0.2/parquet/internal/bmi/bmi_arm64.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  //go:build !noasm
    18  // +build !noasm
    19  
    20  package bmi
    21  
    22  import (
    23  	"fmt"
    24  	"os"
    25  	"strings"
    26  
    27  	"github.com/klauspost/cpuid/v2"
    28  )
    29  
    30  func init() {
    31  	// Added ability to enable extension via environment:
    32  	// ARM_ENABLE_EXT=NEON go test
    33  	if ext, ok := os.LookupEnv("ARM_ENABLE_EXT"); ok {
    34  		if ext == "DISABLE" {
    35  			cpuid.CPU.Disable(cpuid.ASIMD, cpuid.AESARM, cpuid.PMULL)
    36  		} else {
    37  			exts := strings.Split(ext, ",")
    38  
    39  			for _, x := range exts {
    40  				switch x {
    41  				case "NEON":
    42  					cpuid.CPU.Enable(cpuid.ASIMD)
    43  				case "AES":
    44  					cpuid.CPU.Enable(cpuid.AESARM)
    45  				case "PMULL":
    46  					cpuid.CPU.Enable(cpuid.PMULL)
    47  				default:
    48  					fmt.Fprintln(os.Stderr, "unrecognized value for ARM_ENABLE_EXT:", x)
    49  				}
    50  			}
    51  		}
    52  	}
    53  
    54  	// after benchmarking, turns out the pure go lookup table version
    55  	// is nearly twice as fast as the non-lookup table assembly
    56  	// because arm doesn't have a PEXT instruction.
    57  	funclist.extractBits = extractBitsGo
    58  
    59  	if cpuid.CPU.Has(cpuid.ASIMD) {
    60  		funclist.gtbitmap = greaterThanBitmapNEON
    61  	} else {
    62  		funclist.gtbitmap = greaterThanBitmapGo
    63  	}
    64  }