审查视图

vendor/golang.org/x/sys/cpu/byteorder.go 1.8 KB
tangxvhui authored
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
// Copyright 2019 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 cpu

import (
	"runtime"
)

// byteOrder is a subset of encoding/binary.ByteOrder.
type byteOrder interface {
	Uint32([]byte) uint32
	Uint64([]byte) uint64
}

type littleEndian struct{}
type bigEndian struct{}

func (littleEndian) Uint32(b []byte) uint32 {
	_ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
	return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
}

func (littleEndian) Uint64(b []byte) uint64 {
	_ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
	return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 |
		uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56
}

func (bigEndian) Uint32(b []byte) uint32 {
	_ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
	return uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24
}

func (bigEndian) Uint64(b []byte) uint64 {
	_ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
	return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 |
		uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56
}
唐旭辉 authored
42 43
// hostByteOrder returns littleEndian on little-endian machines and
// bigEndian on big-endian machines.
tangxvhui authored
44 45 46
func hostByteOrder() byteOrder {
	switch runtime.GOARCH {
	case "386", "amd64", "amd64p32",
唐旭辉 authored
47
		"alpha",
tangxvhui authored
48 49
		"arm", "arm64",
		"mipsle", "mips64le", "mips64p32le",
唐旭辉 authored
50
		"nios2",
tangxvhui authored
51
		"ppc64le",
唐旭辉 authored
52 53
		"riscv", "riscv64",
		"sh":
tangxvhui authored
54 55
		return littleEndian{}
	case "armbe", "arm64be",
唐旭辉 authored
56
		"m68k",
tangxvhui authored
57 58 59
		"mips", "mips64", "mips64p32",
		"ppc", "ppc64",
		"s390", "s390x",
唐旭辉 authored
60
		"shbe",
tangxvhui authored
61 62 63 64 65
		"sparc", "sparc64":
		return bigEndian{}
	}
	panic("unknown architecture")
}