51 lines
1.3 KiB
Go
51 lines
1.3 KiB
Go
// +build 386 arm armbe arm64 mips mipsle mips64p32 mips64p32le ppc ppc64 ppc64le sparc
|
|
|
|
/*
|
|
* Copyright 2020 Dgraph Labs, Inc. and Contributors
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package simd
|
|
|
|
// Search uses the Clever search to find the correct key.
|
|
func Search(xs []uint64, k uint64) int16 {
|
|
if len(xs) < 8 {
|
|
return Naive(xs, k)
|
|
}
|
|
var twos, pk [4]uint64
|
|
pk[0] = k
|
|
pk[1] = k
|
|
pk[2] = k
|
|
pk[3] = k
|
|
for i := 0; i < len(xs); i += 8 {
|
|
twos[0] = xs[i]
|
|
twos[1] = xs[i+2]
|
|
twos[2] = xs[i+4]
|
|
twos[3] = xs[i+6]
|
|
if twos[0] >= pk[0] {
|
|
return int16(i / 2)
|
|
}
|
|
if twos[1] >= pk[1] {
|
|
return int16((i + 2) / 2)
|
|
}
|
|
if twos[2] >= pk[2] {
|
|
return int16((i + 4) / 2)
|
|
}
|
|
if twos[3] >= pk[3] {
|
|
return int16((i + 6) / 2)
|
|
}
|
|
|
|
}
|
|
return int16(len(xs) / 2)
|
|
}
|