From aa67a19e993590ed40c761a8aaeb814f988d28e2 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Sat, 4 Jul 2015 14:22:05 -0700 Subject: [PATCH] Implement new CPU detection using cpuid, cpuidex plan9 instructions from klauspost/cpuid project, remove C code --- pkg/{utils => }/cpu/cpu.go | 18 +++++----- pkg/cpu/cpu_amd64.s | 27 ++++++++++++++ pkg/{utils => }/cpu/cpu_test.go | 4 +-- pkg/{utils => }/cpu/doc.go | 0 pkg/crypto/sha1/sha1_darwin.go | 2 +- pkg/crypto/sha1/sha1_linux.go | 2 +- pkg/crypto/sha1/sha1_windows.go | 2 +- pkg/crypto/sha256/sha256_linux.go | 2 +- pkg/crypto/sha512/sha512_linux.go | 2 +- pkg/utils/cpu/cpu.c | 59 ------------------------------- 10 files changed, 44 insertions(+), 74 deletions(-) rename pkg/{utils => }/cpu/cpu.go (71%) create mode 100644 pkg/cpu/cpu_amd64.s rename pkg/{utils => }/cpu/cpu_test.go (95%) rename pkg/{utils => }/cpu/doc.go (100%) delete mode 100644 pkg/utils/cpu/cpu.c diff --git a/pkg/utils/cpu/cpu.go b/pkg/cpu/cpu.go similarity index 71% rename from pkg/utils/cpu/cpu.go rename to pkg/cpu/cpu.go index 3fdc3dc13..47c235d27 100644 --- a/pkg/utils/cpu/cpu.go +++ b/pkg/cpu/cpu.go @@ -1,5 +1,5 @@ /* - * Minimalist Object Storage, (C) 2014 Minio, Inc. + * Minimalist Object Storage, (C) 2015 Minio, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,22 +16,24 @@ package cpu -// int has_sse41 (void); -// int has_avx (void); -// int has_avx2 (void); -import "C" +// cpuid, cpuidex +func cpuid(op uint32) (eax, ebx, ecx, edx uint32) +func cpuidex(op, op2 uint32) (eax, ebx, ecx, edx uint32) // HasSSE41 - CPUID instruction verification wrapper for SSE41 extensions func HasSSE41() bool { - return int(C.has_sse41()) == 1 + _, _, c, _ := cpuid(1) + return ((c & (1 << 19)) != 0) } // HasAVX - CPUID instruction verification wrapper for AVX extensions func HasAVX() bool { - return int(C.has_avx()) == 1 + _, _, c, _ := cpuid(1) + return ((c & (1 << 28)) != 0) } // HasAVX2 - CPUID instruction verification wrapper for AVX2 extensions func HasAVX2() bool { - return int(C.has_avx2()) == 1 + _, b, _, _ := cpuidex(7, 0) + return ((b & (1 << 5)) != 0) } diff --git a/pkg/cpu/cpu_amd64.s b/pkg/cpu/cpu_amd64.s new file mode 100644 index 000000000..6ead70174 --- /dev/null +++ b/pkg/cpu/cpu_amd64.s @@ -0,0 +1,27 @@ +// Copyright (c) 2015 Klaus Post, released under MIT License. See LICENSE file. +// +// See https://github.com/klauspost/cpuid/blob/master/LICENSE +// +// Using this inside Minio with modifications +// + +// func cpuid(op uint32) (eax, ebx, ecx, edx uint32) +TEXT ·cpuid(SB),7,$0 + MOVL op+0(FP),AX + CPUID + MOVL AX,eax+8(FP) + MOVL BX,ebx+12(FP) + MOVL CX,ecx+16(FP) + MOVL DX,edx+20(FP) + RET + +// func cpuidex(op, op2 uint32) (eax, ebx, ecx, edx uint32) +TEXT ·cpuidex(SB),7,$0 + MOVL op+0(FP),AX + MOVL op2+4(FP),CX + CPUID + MOVL AX,eax+8(FP) + MOVL BX,ebx+12(FP) + MOVL CX,ecx+16(FP) + MOVL DX,edx+20(FP) + RET diff --git a/pkg/utils/cpu/cpu_test.go b/pkg/cpu/cpu_test.go similarity index 95% rename from pkg/utils/cpu/cpu_test.go rename to pkg/cpu/cpu_test.go index 8fa5ec31c..3e3f67924 100644 --- a/pkg/utils/cpu/cpu_test.go +++ b/pkg/cpu/cpu_test.go @@ -1,5 +1,5 @@ /* - * Minimalist Object Storage, (C) 2014 Minio, Inc. + * Minimalist Object Storage, (C) 2015 Minio, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,7 +24,7 @@ import ( "testing" . "github.com/minio/check" - "github.com/minio/minio/pkg/utils/cpu" + "github.com/minio/minio/pkg/cpu" ) func Test(t *testing.T) { TestingT(t) } diff --git a/pkg/utils/cpu/doc.go b/pkg/cpu/doc.go similarity index 100% rename from pkg/utils/cpu/doc.go rename to pkg/cpu/doc.go diff --git a/pkg/crypto/sha1/sha1_darwin.go b/pkg/crypto/sha1/sha1_darwin.go index 05a9cb333..40a333ec4 100644 --- a/pkg/crypto/sha1/sha1_darwin.go +++ b/pkg/crypto/sha1/sha1_darwin.go @@ -14,7 +14,7 @@ import ( "hash" "io" - "github.com/minio/minio/pkg/utils/cpu" + "github.com/minio/minio/pkg/cpu" ) // The size of a SHA1 checksum in bytes. diff --git a/pkg/crypto/sha1/sha1_linux.go b/pkg/crypto/sha1/sha1_linux.go index d82cadc89..58e34f3b6 100644 --- a/pkg/crypto/sha1/sha1_linux.go +++ b/pkg/crypto/sha1/sha1_linux.go @@ -14,7 +14,7 @@ import ( "hash" "io" - "github.com/minio/minio/pkg/utils/cpu" + "github.com/minio/minio/pkg/cpu" ) // The size of a SHA1 checksum in bytes. diff --git a/pkg/crypto/sha1/sha1_windows.go b/pkg/crypto/sha1/sha1_windows.go index 05a9cb333..40a333ec4 100644 --- a/pkg/crypto/sha1/sha1_windows.go +++ b/pkg/crypto/sha1/sha1_windows.go @@ -14,7 +14,7 @@ import ( "hash" "io" - "github.com/minio/minio/pkg/utils/cpu" + "github.com/minio/minio/pkg/cpu" ) // The size of a SHA1 checksum in bytes. diff --git a/pkg/crypto/sha256/sha256_linux.go b/pkg/crypto/sha256/sha256_linux.go index cfa7e7113..e80c2768e 100644 --- a/pkg/crypto/sha256/sha256_linux.go +++ b/pkg/crypto/sha256/sha256_linux.go @@ -14,7 +14,7 @@ import ( "hash" "io" - "github.com/minio/minio/pkg/utils/cpu" + "github.com/minio/minio/pkg/cpu" ) // The size of a SHA256 checksum in bytes. diff --git a/pkg/crypto/sha512/sha512_linux.go b/pkg/crypto/sha512/sha512_linux.go index aaa94832a..e4c7a0023 100644 --- a/pkg/crypto/sha512/sha512_linux.go +++ b/pkg/crypto/sha512/sha512_linux.go @@ -15,7 +15,7 @@ import ( "hash" "io" - "github.com/minio/minio/pkg/utils/cpu" + "github.com/minio/minio/pkg/cpu" ) // The size of a SHA512 checksum in bytes. diff --git a/pkg/utils/cpu/cpu.c b/pkg/utils/cpu/cpu.c deleted file mode 100644 index afc7920b1..000000000 --- a/pkg/utils/cpu/cpu.c +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Minimalist Object Storage, (C) 2014 Minio, 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 -#include - -static void cpuid(int cpuinfo[4] ,int infotype) { - __asm__ __volatile__ ( - "cpuid": - "=a" (cpuinfo[0]), - "=b" (cpuinfo[1]), - "=c" (cpuinfo[2]), - "=d" (cpuinfo[3]) : - "a" (infotype), "c" (0) - ); -} - -/* - SSE41 : return true - no SSE41 : return false -*/ -int has_sse41 (void) { - int info[4]; - cpuid(info, 0x00000001); - return ((info[2] & ((int)1 << 19)) != 0); -} - -/* - AVX : return true - no AVX : return false -*/ -int has_avx (void) { - int info[4]; - cpuid(info, 0x00000001); - return ((info[2] & ((int)1 << 28)) != 0); -} - -/* - AVX2 : return true - no AVX2 : return false -*/ -int has_avx2 (void) { - int info[4]; - cpuid(info, 0x00000007); - return ((info[1] & ((int)1 << 5)) != 0); -}