github.com/apache/arrow/go/v14@v14.0.1/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 }