github.com/bir3/gocompiler@v0.9.2202/src/xvendor/golang.org/x/arch/ppc64/ppc64asm/field.go (about) 1 // Copyright 2014 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 ppc64asm 6 7 import ( 8 "fmt" 9 "strings" 10 ) 11 12 // A BitField is a bit-field in a 32-bit word. 13 // Bits are counted from 0 from the MSB to 31 as the LSB. 14 type BitField struct { 15 Offs uint8 // the offset of the left-most bit. 16 Bits uint8 // length in bits. 17 // This instruction word holding this field. 18 // It is always 0 for ISA < 3.1 instructions. It is 19 // in decoding order. (0 == prefix, 1 == suffix on ISA 3.1) 20 Word uint8 21 } 22 23 func (b BitField) String() string { 24 if b.Bits > 1 { 25 return fmt.Sprintf("[%d:%d]", b.Offs, int(b.Offs+b.Bits)-1) 26 } else if b.Bits == 1 { 27 return fmt.Sprintf("[%d]", b.Offs) 28 } else { 29 return fmt.Sprintf("[%d, len=0]", b.Offs) 30 } 31 } 32 33 // Parse extracts the bitfield b from i, and return it as an unsigned integer. 34 // Parse will panic if b is invalid. 35 func (b BitField) Parse(i [2]uint32) uint32 { 36 if b.Bits > 32 || b.Bits == 0 || b.Offs > 31 || b.Offs+b.Bits > 32 { 37 panic(fmt.Sprintf("invalid bitfiled %v", b)) 38 } 39 return (i[b.Word] >> (32 - b.Offs - b.Bits)) & ((1 << b.Bits) - 1) 40 } 41 42 // ParseSigned extracts the bitfield b from i, and return it as a signed integer. 43 // ParseSigned will panic if b is invalid. 44 func (b BitField) ParseSigned(i [2]uint32) int32 { 45 u := int32(b.Parse(i)) 46 return u << (32 - b.Bits) >> (32 - b.Bits) 47 } 48 49 // BitFields is a series of BitFields representing a single number. 50 type BitFields []BitField 51 52 func (bs BitFields) String() string { 53 ss := make([]string, len(bs)) 54 for i, bf := range bs { 55 ss[i] = bf.String() 56 } 57 return fmt.Sprintf("<%s>", strings.Join(ss, "|")) 58 } 59 60 func (bs *BitFields) Append(b BitField) { 61 *bs = append(*bs, b) 62 } 63 64 // parse extracts the bitfields from i, concatenate them and return the result 65 // as an unsigned integer and the total length of all the bitfields. 66 // parse will panic if any bitfield in b is invalid, but it doesn't check if 67 // the sequence of bitfields is reasonable. 68 func (bs BitFields) parse(i [2]uint32) (u uint64, Bits uint8) { 69 for _, b := range bs { 70 u = (u << b.Bits) | uint64(b.Parse(i)) 71 Bits += b.Bits 72 } 73 return u, Bits 74 } 75 76 // Parse extracts the bitfields from i, concatenate them and return the result 77 // as an unsigned integer. Parse will panic if any bitfield in b is invalid. 78 func (bs BitFields) Parse(i [2]uint32) uint64 { 79 u, _ := bs.parse(i) 80 return u 81 } 82 83 // ParseSigned extracts the bitfields from i, concatenate them and return the result 84 // as a signed integer. Parse will panic if any bitfield in b is invalid. 85 func (bs BitFields) ParseSigned(i [2]uint32) int64 { 86 u, l := bs.parse(i) 87 return int64(u) << (64 - l) >> (64 - l) 88 } 89 90 // Count the number of bits in the aggregate BitFields 91 func (bs BitFields) NumBits() int { 92 num := 0 93 for _, b := range bs { 94 num += int(b.Bits) 95 } 96 return num 97 }