golang.org/x/sys@v0.20.1-0.20240517151509-673e0f94c16d/cpu/byteorder.go (about)

     1  // Copyright 2019 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package cpu
     6  
     7  import (
     8  	"runtime"
     9  )
    10  
    11  // byteOrder is a subset of encoding/binary.ByteOrder.
    12  type byteOrder interface {
    13  	Uint32([]byte) uint32
    14  	Uint64([]byte) uint64
    15  }
    16  
    17  type littleEndian struct{}
    18  type bigEndian struct{}
    19  
    20  func (littleEndian) Uint32(b []byte) uint32 {
    21  	_ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
    22  	return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
    23  }
    24  
    25  func (littleEndian) Uint64(b []byte) uint64 {
    26  	_ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
    27  	return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 |
    28  		uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56
    29  }
    30  
    31  func (bigEndian) Uint32(b []byte) uint32 {
    32  	_ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
    33  	return uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24
    34  }
    35  
    36  func (bigEndian) Uint64(b []byte) uint64 {
    37  	_ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
    38  	return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 |
    39  		uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56
    40  }
    41  
    42  // hostByteOrder returns littleEndian on little-endian machines and
    43  // bigEndian on big-endian machines.
    44  func hostByteOrder() byteOrder {
    45  	switch runtime.GOARCH {
    46  	case "386", "amd64", "amd64p32",
    47  		"alpha",
    48  		"arm", "arm64",
    49  		"loong64",
    50  		"mipsle", "mips64le", "mips64p32le",
    51  		"nios2",
    52  		"ppc64le",
    53  		"riscv", "riscv64",
    54  		"sh":
    55  		return littleEndian{}
    56  	case "armbe", "arm64be",
    57  		"m68k",
    58  		"mips", "mips64", "mips64p32",
    59  		"ppc", "ppc64",
    60  		"s390", "s390x",
    61  		"shbe",
    62  		"sparc", "sparc64":
    63  		return bigEndian{}
    64  	}
    65  	panic("unknown architecture")
    66  }