github.com/fiatjaf/generic-ristretto@v0.0.1/z/simd/search.go (about) 1 //go:build !amd64 2 // +build !amd64 3 4 /* 5 * Copyright 2020 Dgraph Labs, Inc. and Contributors 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 */ 19 20 package simd 21 22 // Search uses the Clever search to find the correct key. 23 func Search(xs []uint64, k uint64) int16 { 24 if len(xs) < 8 || (len(xs)%8 != 0) { 25 return Naive(xs, k) 26 } 27 var twos, pk [4]uint64 28 pk[0] = k 29 pk[1] = k 30 pk[2] = k 31 pk[3] = k 32 for i := 0; i < len(xs); i += 8 { 33 twos[0] = xs[i] 34 twos[1] = xs[i+2] 35 twos[2] = xs[i+4] 36 twos[3] = xs[i+6] 37 if twos[0] >= pk[0] { 38 return int16(i / 2) 39 } 40 if twos[1] >= pk[1] { 41 return int16((i + 2) / 2) 42 } 43 if twos[2] >= pk[2] { 44 return int16((i + 4) / 2) 45 } 46 if twos[3] >= pk[3] { 47 return int16((i + 6) / 2) 48 } 49 50 } 51 return int16(len(xs) / 2) 52 }