| // Copyright 2015 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. | |
| package runtime | |
| import ( | |
| "internal/cpu" | |
| ) | |
| var memmoveBits uint8 | |
| const ( | |
| // avxSupported indicates that the CPU supports AVX instructions. | |
| avxSupported = 1 << 0 | |
| // repmovsPreferred indicates that REP MOVSx instruction is more | |
| // efficient on the CPU. | |
| repmovsPreferred = 1 << 1 | |
| ) | |
| func init() { | |
| // Here we assume that on modern CPUs with both FSRM and ERMS features, | |
| // copying data blocks of 2KB or larger using the REP MOVSB instruction | |
| // will be more efficient to avoid having to keep up with CPU generations. | |
| // Therefore, we may retain a BlockList mechanism to ensure that microarchitectures | |
| // that do not fit this case may appear in the future. | |
| // We enable it on Intel CPUs first, and we may support more platforms | |
| // in the future. | |
| isERMSNiceCPU := isIntel | |
| useREPMOV := isERMSNiceCPU && cpu.X86.HasERMS && cpu.X86.HasFSRM | |
| if cpu.X86.HasAVX { | |
| memmoveBits |= avxSupported | |
| } | |
| if useREPMOV { | |
| memmoveBits |= repmovsPreferred | |
| } | |
| } |