skeleton register package
This commit is contained in:
24
reg/reg_test.go
Normal file
24
reg/reg_test.go
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
package reg
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestSpecBytes(t *testing.T) {
|
||||||
|
cases := []struct {
|
||||||
|
Spec Spec
|
||||||
|
Bytes uint
|
||||||
|
}{
|
||||||
|
{S8L, 1},
|
||||||
|
{S8H, 1},
|
||||||
|
{S16, 2},
|
||||||
|
{S32, 4},
|
||||||
|
{S64, 8},
|
||||||
|
{S128, 16},
|
||||||
|
{S256, 32},
|
||||||
|
{S512, 64},
|
||||||
|
}
|
||||||
|
for _, c := range cases {
|
||||||
|
if c.Spec.Bytes() != c.Bytes {
|
||||||
|
t.Errorf("%v.Bytes() = %d; expect = %d", c.Spec, c.Spec.Bytes(), c.Bytes)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
109
reg/types.go
Normal file
109
reg/types.go
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
package reg
|
||||||
|
|
||||||
|
type Size uint
|
||||||
|
|
||||||
|
const (
|
||||||
|
B8 Size = 1 << iota
|
||||||
|
B16
|
||||||
|
B32
|
||||||
|
B64
|
||||||
|
B128
|
||||||
|
B256
|
||||||
|
B512
|
||||||
|
)
|
||||||
|
|
||||||
|
func (s Size) Bytes() uint { return uint(s) }
|
||||||
|
|
||||||
|
type Kind uint8
|
||||||
|
|
||||||
|
type Family struct {
|
||||||
|
Kind Kind
|
||||||
|
registers []Register
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *Family) define(s Spec, id uint16, name string) Register {
|
||||||
|
r := register{
|
||||||
|
id: id,
|
||||||
|
kind: f.Kind,
|
||||||
|
name: name,
|
||||||
|
Spec: s,
|
||||||
|
}
|
||||||
|
f.registers = append(f.registers, r)
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *Family) Virtual(id uint16, s Size) Virtual {
|
||||||
|
return virtual{
|
||||||
|
id: id,
|
||||||
|
kind: f.Kind,
|
||||||
|
Size: s,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type private interface {
|
||||||
|
private()
|
||||||
|
}
|
||||||
|
|
||||||
|
type Virtual interface {
|
||||||
|
VirtualID() uint16
|
||||||
|
Kind() Kind
|
||||||
|
Bytes() uint
|
||||||
|
}
|
||||||
|
|
||||||
|
type virtual struct {
|
||||||
|
id uint16
|
||||||
|
kind Kind
|
||||||
|
Size
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v virtual) VirtualID() uint16 { return v.id }
|
||||||
|
func (v virtual) Kind() Kind { return v.kind }
|
||||||
|
|
||||||
|
type Register interface {
|
||||||
|
PhysicalID() uint16
|
||||||
|
Kind() Kind
|
||||||
|
Mask() uint16
|
||||||
|
Bytes() uint
|
||||||
|
Name() string
|
||||||
|
private
|
||||||
|
}
|
||||||
|
|
||||||
|
type register struct {
|
||||||
|
id uint16
|
||||||
|
kind Kind
|
||||||
|
name string
|
||||||
|
Spec
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r register) PhysicalID() uint16 { return r.id }
|
||||||
|
func (r register) Kind() Kind { return r.kind }
|
||||||
|
func (r register) Name() string { return r.name }
|
||||||
|
func (r register) private() {}
|
||||||
|
|
||||||
|
type Spec uint16
|
||||||
|
|
||||||
|
const (
|
||||||
|
S8L Spec = 0x1
|
||||||
|
S8H Spec = 0x2
|
||||||
|
S8 = S8L
|
||||||
|
S16 Spec = 0x3
|
||||||
|
S32 Spec = 0x7
|
||||||
|
S64 Spec = 0xf
|
||||||
|
S128 Spec = 0x1f
|
||||||
|
S256 Spec = 0x3f
|
||||||
|
S512 Spec = 0x7f
|
||||||
|
)
|
||||||
|
|
||||||
|
// Mask returns a mask representing which bytes of an underlying register are
|
||||||
|
// used by this register. This is almost always the low bytes, except for the
|
||||||
|
// case of the high-byte registers. If bit n of the mask is set, this means
|
||||||
|
// bytes 2^(n-1) to 2^n-1 are used.
|
||||||
|
func (s Spec) Mask() uint16 {
|
||||||
|
return uint16(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bytes returns the register size in bytes.
|
||||||
|
func (s Spec) Bytes() uint {
|
||||||
|
x := uint(s)
|
||||||
|
return (x >> 1) + (x & 1)
|
||||||
|
}
|
||||||
201
reg/x86.go
Normal file
201
reg/x86.go
Normal file
@@ -0,0 +1,201 @@
|
|||||||
|
package reg
|
||||||
|
|
||||||
|
// Register families.
|
||||||
|
const (
|
||||||
|
GP Kind = iota
|
||||||
|
MMX
|
||||||
|
SSEAVX
|
||||||
|
Mask
|
||||||
|
)
|
||||||
|
|
||||||
|
// General purpose registers.
|
||||||
|
var (
|
||||||
|
GeneralPurpose = &Family{Kind: GP}
|
||||||
|
|
||||||
|
// Low byte
|
||||||
|
AL = GeneralPurpose.define(S8L, 0, "AL")
|
||||||
|
CL = GeneralPurpose.define(S8L, 1, "CL")
|
||||||
|
DL = GeneralPurpose.define(S8L, 2, "DL")
|
||||||
|
BL = GeneralPurpose.define(S8L, 3, "BL")
|
||||||
|
|
||||||
|
// High byte
|
||||||
|
AH = GeneralPurpose.define(S8H, 0, "AH")
|
||||||
|
CH = GeneralPurpose.define(S8H, 1, "CH")
|
||||||
|
DH = GeneralPurpose.define(S8H, 2, "DH")
|
||||||
|
BH = GeneralPurpose.define(S8H, 3, "BH")
|
||||||
|
|
||||||
|
// 8-bit
|
||||||
|
SPB = GeneralPurpose.define(S8, 4, "SP")
|
||||||
|
BPB = GeneralPurpose.define(S8, 5, "BP")
|
||||||
|
SIB = GeneralPurpose.define(S8, 6, "SI")
|
||||||
|
DIB = GeneralPurpose.define(S8, 7, "DI")
|
||||||
|
R8B = GeneralPurpose.define(S8, 8, "R8")
|
||||||
|
R9B = GeneralPurpose.define(S8, 9, "R9")
|
||||||
|
R10B = GeneralPurpose.define(S8, 10, "R10")
|
||||||
|
R11B = GeneralPurpose.define(S8, 11, "R11")
|
||||||
|
R12B = GeneralPurpose.define(S8, 12, "R12")
|
||||||
|
R13B = GeneralPurpose.define(S8, 13, "R13")
|
||||||
|
R14B = GeneralPurpose.define(S8, 14, "R14")
|
||||||
|
R15B = GeneralPurpose.define(S8, 15, "R15")
|
||||||
|
|
||||||
|
// 16-bit
|
||||||
|
AX = GeneralPurpose.define(S16, 0, "AX")
|
||||||
|
CX = GeneralPurpose.define(S16, 1, "CX")
|
||||||
|
DX = GeneralPurpose.define(S16, 2, "DX")
|
||||||
|
BX = GeneralPurpose.define(S16, 3, "BX")
|
||||||
|
SP = GeneralPurpose.define(S16, 4, "SP")
|
||||||
|
BP = GeneralPurpose.define(S16, 5, "BP")
|
||||||
|
SI = GeneralPurpose.define(S16, 6, "SI")
|
||||||
|
DI = GeneralPurpose.define(S16, 7, "DI")
|
||||||
|
R8W = GeneralPurpose.define(S16, 8, "R8")
|
||||||
|
R9W = GeneralPurpose.define(S16, 9, "R9")
|
||||||
|
R10W = GeneralPurpose.define(S16, 10, "R10")
|
||||||
|
R11W = GeneralPurpose.define(S16, 11, "R11")
|
||||||
|
R12W = GeneralPurpose.define(S16, 12, "R12")
|
||||||
|
R13W = GeneralPurpose.define(S16, 13, "R13")
|
||||||
|
R14W = GeneralPurpose.define(S16, 14, "R14")
|
||||||
|
R15W = GeneralPurpose.define(S16, 15, "R15")
|
||||||
|
|
||||||
|
// 32-bit
|
||||||
|
EAX = GeneralPurpose.define(S32, 0, "AX")
|
||||||
|
ECX = GeneralPurpose.define(S32, 1, "CX")
|
||||||
|
EDX = GeneralPurpose.define(S32, 2, "DX")
|
||||||
|
EBX = GeneralPurpose.define(S32, 3, "BX")
|
||||||
|
ESP = GeneralPurpose.define(S32, 4, "SP")
|
||||||
|
EBP = GeneralPurpose.define(S32, 5, "BP")
|
||||||
|
ESI = GeneralPurpose.define(S32, 6, "SI")
|
||||||
|
EDI = GeneralPurpose.define(S32, 7, "DI")
|
||||||
|
R8L = GeneralPurpose.define(S32, 8, "R8")
|
||||||
|
R9L = GeneralPurpose.define(S32, 9, "R9")
|
||||||
|
R10L = GeneralPurpose.define(S32, 10, "R10")
|
||||||
|
R11L = GeneralPurpose.define(S32, 11, "R11")
|
||||||
|
R12L = GeneralPurpose.define(S32, 12, "R12")
|
||||||
|
R13L = GeneralPurpose.define(S32, 13, "R13")
|
||||||
|
R14L = GeneralPurpose.define(S32, 14, "R14")
|
||||||
|
R15L = GeneralPurpose.define(S32, 15, "R15")
|
||||||
|
|
||||||
|
// 64-bit
|
||||||
|
RAX = GeneralPurpose.define(S64, 0, "AX")
|
||||||
|
RCX = GeneralPurpose.define(S64, 1, "CX")
|
||||||
|
RDX = GeneralPurpose.define(S64, 2, "DX")
|
||||||
|
RBX = GeneralPurpose.define(S64, 3, "BX")
|
||||||
|
RSP = GeneralPurpose.define(S64, 4, "SP")
|
||||||
|
RBP = GeneralPurpose.define(S64, 5, "BP")
|
||||||
|
RSI = GeneralPurpose.define(S64, 6, "SI")
|
||||||
|
RDI = GeneralPurpose.define(S64, 7, "DI")
|
||||||
|
R8 = GeneralPurpose.define(S64, 8, "R8")
|
||||||
|
R9 = GeneralPurpose.define(S64, 9, "R9")
|
||||||
|
R10 = GeneralPurpose.define(S64, 10, "R10")
|
||||||
|
R11 = GeneralPurpose.define(S64, 11, "R11")
|
||||||
|
R12 = GeneralPurpose.define(S64, 12, "R12")
|
||||||
|
R13 = GeneralPurpose.define(S64, 13, "R13")
|
||||||
|
R14 = GeneralPurpose.define(S64, 14, "R14")
|
||||||
|
R15 = GeneralPurpose.define(S64, 15, "R15")
|
||||||
|
)
|
||||||
|
|
||||||
|
// SIMD registers.
|
||||||
|
var (
|
||||||
|
SIMD = &Family{Kind: SSEAVX}
|
||||||
|
|
||||||
|
// 128-bit
|
||||||
|
X0 = SIMD.define(S128, 0, "X0")
|
||||||
|
X1 = SIMD.define(S128, 1, "X1")
|
||||||
|
X2 = SIMD.define(S128, 2, "X2")
|
||||||
|
X3 = SIMD.define(S128, 3, "X3")
|
||||||
|
X4 = SIMD.define(S128, 4, "X4")
|
||||||
|
X5 = SIMD.define(S128, 5, "X5")
|
||||||
|
X6 = SIMD.define(S128, 6, "X6")
|
||||||
|
X7 = SIMD.define(S128, 7, "X7")
|
||||||
|
X8 = SIMD.define(S128, 8, "X8")
|
||||||
|
X9 = SIMD.define(S128, 9, "X9")
|
||||||
|
X10 = SIMD.define(S128, 10, "X10")
|
||||||
|
X11 = SIMD.define(S128, 11, "X11")
|
||||||
|
X12 = SIMD.define(S128, 12, "X12")
|
||||||
|
X13 = SIMD.define(S128, 13, "X13")
|
||||||
|
X14 = SIMD.define(S128, 14, "X14")
|
||||||
|
X15 = SIMD.define(S128, 15, "X15")
|
||||||
|
X16 = SIMD.define(S128, 16, "X16")
|
||||||
|
X17 = SIMD.define(S128, 17, "X17")
|
||||||
|
X18 = SIMD.define(S128, 18, "X18")
|
||||||
|
X19 = SIMD.define(S128, 19, "X19")
|
||||||
|
X20 = SIMD.define(S128, 20, "X20")
|
||||||
|
X21 = SIMD.define(S128, 21, "X21")
|
||||||
|
X22 = SIMD.define(S128, 22, "X22")
|
||||||
|
X23 = SIMD.define(S128, 23, "X23")
|
||||||
|
X24 = SIMD.define(S128, 24, "X24")
|
||||||
|
X25 = SIMD.define(S128, 25, "X25")
|
||||||
|
X26 = SIMD.define(S128, 26, "X26")
|
||||||
|
X27 = SIMD.define(S128, 27, "X27")
|
||||||
|
X28 = SIMD.define(S128, 28, "X28")
|
||||||
|
X29 = SIMD.define(S128, 29, "X29")
|
||||||
|
X30 = SIMD.define(S128, 30, "X30")
|
||||||
|
X31 = SIMD.define(S128, 31, "X31")
|
||||||
|
|
||||||
|
// 256-bit
|
||||||
|
Y0 = SIMD.define(S256, 0, "Y0")
|
||||||
|
Y1 = SIMD.define(S256, 1, "Y1")
|
||||||
|
Y2 = SIMD.define(S256, 2, "Y2")
|
||||||
|
Y3 = SIMD.define(S256, 3, "Y3")
|
||||||
|
Y4 = SIMD.define(S256, 4, "Y4")
|
||||||
|
Y5 = SIMD.define(S256, 5, "Y5")
|
||||||
|
Y6 = SIMD.define(S256, 6, "Y6")
|
||||||
|
Y7 = SIMD.define(S256, 7, "Y7")
|
||||||
|
Y8 = SIMD.define(S256, 8, "Y8")
|
||||||
|
Y9 = SIMD.define(S256, 9, "Y9")
|
||||||
|
Y10 = SIMD.define(S256, 10, "Y10")
|
||||||
|
Y11 = SIMD.define(S256, 11, "Y11")
|
||||||
|
Y12 = SIMD.define(S256, 12, "Y12")
|
||||||
|
Y13 = SIMD.define(S256, 13, "Y13")
|
||||||
|
Y14 = SIMD.define(S256, 14, "Y14")
|
||||||
|
Y15 = SIMD.define(S256, 15, "Y15")
|
||||||
|
Y16 = SIMD.define(S256, 16, "Y16")
|
||||||
|
Y17 = SIMD.define(S256, 17, "Y17")
|
||||||
|
Y18 = SIMD.define(S256, 18, "Y18")
|
||||||
|
Y19 = SIMD.define(S256, 19, "Y19")
|
||||||
|
Y20 = SIMD.define(S256, 20, "Y20")
|
||||||
|
Y21 = SIMD.define(S256, 21, "Y21")
|
||||||
|
Y22 = SIMD.define(S256, 22, "Y22")
|
||||||
|
Y23 = SIMD.define(S256, 23, "Y23")
|
||||||
|
Y24 = SIMD.define(S256, 24, "Y24")
|
||||||
|
Y25 = SIMD.define(S256, 25, "Y25")
|
||||||
|
Y26 = SIMD.define(S256, 26, "Y26")
|
||||||
|
Y27 = SIMD.define(S256, 27, "Y27")
|
||||||
|
Y28 = SIMD.define(S256, 28, "Y28")
|
||||||
|
Y29 = SIMD.define(S256, 29, "Y29")
|
||||||
|
Y30 = SIMD.define(S256, 30, "Y30")
|
||||||
|
Y31 = SIMD.define(S256, 31, "Y31")
|
||||||
|
|
||||||
|
// 512-bit
|
||||||
|
Z0 = SIMD.define(S512, 0, "Z0")
|
||||||
|
Z1 = SIMD.define(S512, 1, "Z1")
|
||||||
|
Z2 = SIMD.define(S512, 2, "Z2")
|
||||||
|
Z3 = SIMD.define(S512, 3, "Z3")
|
||||||
|
Z4 = SIMD.define(S512, 4, "Z4")
|
||||||
|
Z5 = SIMD.define(S512, 5, "Z5")
|
||||||
|
Z6 = SIMD.define(S512, 6, "Z6")
|
||||||
|
Z7 = SIMD.define(S512, 7, "Z7")
|
||||||
|
Z8 = SIMD.define(S512, 8, "Z8")
|
||||||
|
Z9 = SIMD.define(S512, 9, "Z9")
|
||||||
|
Z10 = SIMD.define(S512, 10, "Z10")
|
||||||
|
Z11 = SIMD.define(S512, 11, "Z11")
|
||||||
|
Z12 = SIMD.define(S512, 12, "Z12")
|
||||||
|
Z13 = SIMD.define(S512, 13, "Z13")
|
||||||
|
Z14 = SIMD.define(S512, 14, "Z14")
|
||||||
|
Z15 = SIMD.define(S512, 15, "Z15")
|
||||||
|
Z16 = SIMD.define(S512, 16, "Z16")
|
||||||
|
Z17 = SIMD.define(S512, 17, "Z17")
|
||||||
|
Z18 = SIMD.define(S512, 18, "Z18")
|
||||||
|
Z19 = SIMD.define(S512, 19, "Z19")
|
||||||
|
Z20 = SIMD.define(S512, 20, "Z20")
|
||||||
|
Z21 = SIMD.define(S512, 21, "Z21")
|
||||||
|
Z22 = SIMD.define(S512, 22, "Z22")
|
||||||
|
Z23 = SIMD.define(S512, 23, "Z23")
|
||||||
|
Z24 = SIMD.define(S512, 24, "Z24")
|
||||||
|
Z25 = SIMD.define(S512, 25, "Z25")
|
||||||
|
Z26 = SIMD.define(S512, 26, "Z26")
|
||||||
|
Z27 = SIMD.define(S512, 27, "Z27")
|
||||||
|
Z28 = SIMD.define(S512, 28, "Z28")
|
||||||
|
Z29 = SIMD.define(S512, 29, "Z29")
|
||||||
|
Z30 = SIMD.define(S512, 30, "Z30")
|
||||||
|
Z31 = SIMD.define(S512, 31, "Z31")
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user