diff --git a/src/runtime/internal/sys/intrinsics.go b/src/runtime/internal/sys/intrinsics.go index 1054c6948f403..08a062f85acf3 100644 --- a/src/runtime/internal/sys/intrinsics.go +++ b/src/runtime/internal/sys/intrinsics.go @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// +build !386 + package sys // Using techniques from http://supertech.csail.mit.edu/papers/debruijn.pdf diff --git a/src/runtime/internal/sys/intrinsics_386.s b/src/runtime/internal/sys/intrinsics_386.s new file mode 100644 index 0000000000000..1f48e264922fa --- /dev/null +++ b/src/runtime/internal/sys/intrinsics_386.s @@ -0,0 +1,68 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include "textflag.h" + +TEXT runtime∕internal∕sys·Ctz64(SB), NOSPLIT, $0-16 + MOVL $0, ret_hi+12(FP) + + // Try low 32 bits. + MOVL x_lo+0(FP), AX + BSFL AX, AX + JZ tryhigh + MOVL AX, ret_lo+8(FP) + RET + +tryhigh: + // Try high 32 bits. + MOVL x_hi+4(FP), AX + BSFL AX, AX + JZ none + ADDL $32, AX + MOVL AX, ret_lo+8(FP) + RET + +none: + // No bits are set. + MOVL $64, ret_lo+8(FP) + RET + +TEXT runtime∕internal∕sys·Ctz32(SB), NOSPLIT, $0-8 + MOVL x+0(FP), AX + BSFL AX, AX + JNZ 2(PC) + MOVL $32, AX + MOVL AX, ret+4(FP) + RET + +TEXT runtime∕internal∕sys·Ctz16(SB), NOSPLIT, $0-6 + MOVW x+0(FP), AX + BSFW AX, AX + JNZ 2(PC) + MOVW $16, AX + MOVW AX, ret+4(FP) + RET + +TEXT runtime∕internal∕sys·Ctz8(SB), NOSPLIT, $0-5 + MOVBLZX x+0(FP), AX + BSFL AX, AX + JNZ 2(PC) + MOVB $8, AX + MOVB AX, ret+4(FP) + RET + +TEXT runtime∕internal∕sys·Bswap64(SB), NOSPLIT, $0-16 + MOVL x_lo+0(FP), AX + MOVL x_hi+4(FP), BX + BSWAPL AX + BSWAPL BX + MOVL BX, ret_lo+8(FP) + MOVL AX, ret_hi+12(FP) + RET + +TEXT runtime∕internal∕sys·Bswap32(SB), NOSPLIT, $0-8 + MOVL x+0(FP), AX + BSWAPL AX + MOVL AX, ret+4(FP) + RET diff --git a/src/runtime/internal/sys/intrinsics_stubs.go b/src/runtime/internal/sys/intrinsics_stubs.go new file mode 100644 index 0000000000000..079844fda4ea5 --- /dev/null +++ b/src/runtime/internal/sys/intrinsics_stubs.go @@ -0,0 +1,14 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build 386 + +package sys + +func Ctz64(x uint64) uint64 +func Ctz32(x uint32) uint32 +func Ctz16(x uint16) uint16 +func Ctz8(x uint8) uint8 +func Bswap64(x uint64) uint64 +func Bswap32(x uint32) uint32