gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

byteorder.go (1868B)


      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 }