github.com/apache/arrow/go/v7@v7.0.1/parquet/internal/utils/min_max.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 package utils 18 19 import ( 20 "math" 21 ) 22 23 // this file contains pure go implementations of the min_max functions that are 24 // SIMD accelerated so that we can fallback to these if the cpu doesn't support 25 // AVX2 or SSE4 instructions. 26 27 func int32MinMax(values []int32) (min, max int32) { 28 min = math.MaxInt32 29 max = math.MinInt32 30 31 for _, v := range values { 32 if min > v { 33 min = v 34 } 35 if max < v { 36 max = v 37 } 38 } 39 return 40 } 41 42 func uint32MinMax(values []uint32) (min, max uint32) { 43 min = math.MaxUint32 44 max = 0 45 46 for _, v := range values { 47 if min > v { 48 min = v 49 } 50 if max < v { 51 max = v 52 } 53 } 54 return 55 } 56 57 func int64MinMax(values []int64) (min, max int64) { 58 min = math.MaxInt64 59 max = math.MinInt64 60 61 for _, v := range values { 62 if min > v { 63 min = v 64 } 65 if max < v { 66 max = v 67 } 68 } 69 return 70 } 71 72 func uint64MinMax(values []uint64) (min, max uint64) { 73 min = math.MaxUint64 74 max = 0 75 76 for _, v := range values { 77 if min > v { 78 min = v 79 } 80 if max < v { 81 max = v 82 } 83 } 84 return 85 } 86 87 var minmaxFuncs = struct { 88 i32 func([]int32) (int32, int32) 89 ui32 func([]uint32) (uint32, uint32) 90 i64 func([]int64) (int64, int64) 91 ui64 func([]uint64) (uint64, uint64) 92 }{} 93 94 // GetMinMaxInt32 returns the min and max for a int32 slice, using AVX2 or 95 // SSE4 cpu extensions if available, falling back to a pure go implementation 96 // if they are unavailable or built with the noasm tag. 97 func GetMinMaxInt32(v []int32) (min, max int32) { 98 return minmaxFuncs.i32(v) 99 } 100 101 // GetMinMaxUint32 returns the min and max for a uint32 slice, using AVX2 or 102 // SSE4 cpu extensions if available, falling back to a pure go implementation 103 // if they are unavailable or built with the noasm tag. 104 func GetMinMaxUint32(v []uint32) (min, max uint32) { 105 return minmaxFuncs.ui32(v) 106 } 107 108 // GetMinMaxInt64 returns the min and max for a int64 slice, using AVX2 or 109 // SSE4 cpu extensions if available, falling back to a pure go implementation 110 // if they are unavailable or built with the noasm tag. 111 func GetMinMaxInt64(v []int64) (min, max int64) { 112 return minmaxFuncs.i64(v) 113 } 114 115 // GetMinMaxUint64 returns the min and max for a uint64 slice, using AVX2 or 116 // SSE4 cpu extensions if available, falling back to a pure go implementation 117 // if they are unavailable or built with the noasm tag. 118 func GetMinMaxUint64(v []uint64) (min, max uint64) { 119 return minmaxFuncs.ui64(v) 120 }