| // 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 |
| } |
| } |