...
Source file src/pkg/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/field.go
1
2
3
4
5 package ppc64asm
6
7 import (
8 "fmt"
9 "strings"
10 )
11
12
13
14 type BitField struct {
15 Offs uint8
16 Bits uint8
17 }
18
19 func (b BitField) String() string {
20 if b.Bits > 1 {
21 return fmt.Sprintf("[%d:%d]", b.Offs, int(b.Offs+b.Bits)-1)
22 } else if b.Bits == 1 {
23 return fmt.Sprintf("[%d]", b.Offs)
24 } else {
25 return fmt.Sprintf("[%d, len=0]", b.Offs)
26 }
27 }
28
29
30
31 func (b BitField) Parse(i uint32) uint32 {
32 if b.Bits > 32 || b.Bits == 0 || b.Offs > 31 || b.Offs+b.Bits > 32 {
33 panic(fmt.Sprintf("invalid bitfiled %v", b))
34 }
35 return (i >> (32 - b.Offs - b.Bits)) & ((1 << b.Bits) - 1)
36 }
37
38
39
40 func (b BitField) ParseSigned(i uint32) int32 {
41 u := int32(b.Parse(i))
42 return u << (32 - b.Bits) >> (32 - b.Bits)
43 }
44
45
46 type BitFields []BitField
47
48 func (bs BitFields) String() string {
49 ss := make([]string, len(bs))
50 for i, bf := range bs {
51 ss[i] = bf.String()
52 }
53 return fmt.Sprintf("<%s>", strings.Join(ss, "|"))
54 }
55
56 func (bs *BitFields) Append(b BitField) {
57 *bs = append(*bs, b)
58 }
59
60
61
62
63
64 func (bs BitFields) parse(i uint32) (u uint32, Bits uint8) {
65 for _, b := range bs {
66 u = (u << b.Bits) | b.Parse(i)
67 Bits += b.Bits
68 }
69 return u, Bits
70 }
71
72
73
74 func (bs BitFields) Parse(i uint32) uint32 {
75 u, _ := bs.parse(i)
76 return u
77 }
78
79
80
81 func (bs BitFields) ParseSigned(i uint32) int32 {
82 u, l := bs.parse(i)
83 return int32(u) << (32 - l) >> (32 - l)
84 }
85
View as plain text