/
assemble.go
105 lines (83 loc) · 2.12 KB
/
assemble.go
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package assemble
import (
"fmt"
"math/bits"
"github.com/hawkowl/biscuit/pkg/common"
"github.com/hawkowl/biscuit/pkg/opcodes"
)
type Opcode interface {
Encode() (uint32, error)
}
func FitsIn(inp uint32, nbits int) (uint32, error) {
if bits.Len32(inp) > nbits {
return 0, fmt.Errorf("%d does not fit in %d bits", inp, nbits)
}
return uint32(inp), nil
}
func GEN_IMM20(inp int32) (uint32, error) {
i, err := common.ImmI(inp, 20)
return i << 12, err
}
func GEN_IMM12(inp int32) (uint32, error) {
i, err := common.ImmI(inp, 12)
return i << 20, err
}
func GEN_IMM12HI(inp int32) (uint32, error) {
i, err := common.ImmI(inp, 12)
return (i >> 5) << 25, err
}
func GEN_IMM12LO(inp int32) (uint32, error) {
i, err := common.ImmI(inp, 12)
return (i & 0x1f) << 7, err
}
func GEN_BIMM12HI(inp int32) (uint32, error) {
i, err := common.ImmI(inp, 13)
return (i>>12)<<31 | ((i>>5)&0x3f)<<25, err
}
func GEN_BIMM12LO(inp int32) (uint32, error) {
i, err := common.ImmI(inp, 13)
return ((i>>1)&0xf)<<8 | ((i>>11)&0x1)<<7, err
}
func GEN_JIMM20(inp int32) (uint32, error) {
i, err := common.ImmI(inp, 21)
return (i>>20)<<31 | ((i>>1)&0x3ff)<<21 | ((i>>11)&0x1)<<20 | ((i>>12)&0xff)<<12, err
}
func GEN_SUCC(inp uint32) (uint32, error) {
i, err := FitsIn(inp, 12)
return (i & 0xF) << 20, err
}
func GEN_PRED(inp uint32) (uint32, error) {
i, err := FitsIn(inp, 12)
return ((i >> 4) & 0xF) << 24, err
}
func GEN_FM(inp uint32) (uint32, error) {
i, err := FitsIn(inp, 12)
return ((i >> 8) & 0xF) << 28, err
}
func GEN_RD(inp uint32) (uint32, error) {
i, err := FitsIn(inp, 5)
return i << 7, err
}
func GEN_RS1(inp uint32) (uint32, error) {
i, err := FitsIn(inp, 5)
return i << 15, err
}
func GEN_RS2(inp uint32) (uint32, error) {
i, err := FitsIn(inp, 5)
return i << 20, err
}
func GEN_CSR(inp uint32) (uint32, error) {
i, err := FitsIn(inp, 12)
return i << 20, err
}
func GEN_ZIMM(inp uint32) (uint32, error) {
i, err := FitsIn(inp, 5)
return i << 20, err
}
func GEN_SHAMTW(inp uint32) (uint32, error) {
i, err := FitsIn(inp, 5)
return i << 20, err
}
func EncodeILLEGAL(o opcodes.OP_ILLEGAL) (uint32, error) {
return 0, nil
}