diff --git a/lang/mcache/bsr_amd64.go b/lang/mcache/bsr_amd64.go deleted file mode 100644 index fe9d7504..00000000 --- a/lang/mcache/bsr_amd64.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2021 ByteDance Inc. -// -// 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 mcache - -func bsr(x int) int - -func lzcnt(x int) int diff --git a/lang/mcache/bsr_amd64.s b/lang/mcache/bsr_amd64.s deleted file mode 100644 index 8a73f1e8..00000000 --- a/lang/mcache/bsr_amd64.s +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2021 ByteDance Inc. -// -// 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. - -#include "textflag.h" - -// func lzcnt(x int) int -TEXT ·lzcnt(SB), NOSPLIT, $0-16 - LZCNTQ x+0(FP), AX - MOVQ AX, ret+8(FP) - RET - -// func bsr(x int) int -TEXT ·bsr(SB), NOSPLIT, $0-16 - BSRQ x+0(FP), AX - MOVQ AX, ret+8(FP) - RET diff --git a/lang/mcache/bsr_other.go b/lang/mcache/bsr_other.go deleted file mode 100644 index 636de30f..00000000 --- a/lang/mcache/bsr_other.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2021 ByteDance Inc. -// -// 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. - -//go:build !amd64 -// +build !amd64 - -package mcache - -func bsr(x int) int { - r := 0 - for x != 0 { - x = x >> 1 - r += 1 - } - return r - 1 -} diff --git a/lang/mcache/utils.go b/lang/mcache/utils.go index 38d6cb2e..71326f92 100644 --- a/lang/mcache/utils.go +++ b/lang/mcache/utils.go @@ -14,6 +14,12 @@ package mcache +import "math/bits" + +func bsr(x int) int { + return bits.Len(uint(x)) - 1 +} + func isPowerOfTwo(x int) bool { return (x & (-x)) == x } diff --git a/lang/mcache/bsr_test.go b/lang/mcache/utils_test.go similarity index 82% rename from lang/mcache/bsr_test.go rename to lang/mcache/utils_test.go index 3239231a..50117f0f 100644 --- a/lang/mcache/bsr_test.go +++ b/lang/mcache/utils_test.go @@ -26,3 +26,13 @@ func TestBsr(t *testing.T) { assert.Equal(t, bsr((1<<10)-1), 9) assert.Equal(t, bsr((1<<30)+(1<<19)+(1<<16)+(1<<1)), 30) } + +func BenchmarkBsr(b *testing.B) { + num := (1 << 30) + (1 << 19) + (1 << 16) + (1 << 1) + + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + _ = bsr(num + i) + } +}