summaryrefslogtreecommitdiff
path: root/vendor/github.com/cloudwego/iasm/x86_64/registers.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/cloudwego/iasm/x86_64/registers.go')
-rw-r--r--vendor/github.com/cloudwego/iasm/x86_64/registers.go693
1 files changed, 693 insertions, 0 deletions
diff --git a/vendor/github.com/cloudwego/iasm/x86_64/registers.go b/vendor/github.com/cloudwego/iasm/x86_64/registers.go
new file mode 100644
index 000000000..574c2ee96
--- /dev/null
+++ b/vendor/github.com/cloudwego/iasm/x86_64/registers.go
@@ -0,0 +1,693 @@
+//
+// Copyright 2024 CloudWeGo Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+package x86_64
+
+import (
+ `fmt`
+)
+
+// Register represents a hardware register.
+type Register interface {
+ fmt.Stringer
+ implRegister()
+}
+
+type (
+ Register8 byte
+ Register16 byte
+ Register32 byte
+ Register64 byte
+)
+
+type (
+ KRegister byte
+ MMRegister byte
+ XMMRegister byte
+ YMMRegister byte
+ ZMMRegister byte
+)
+
+// RegisterMask is a KRegister used to mask another register.
+type RegisterMask struct {
+ Z bool
+ K KRegister
+}
+
+// String implements the fmt.Stringer interface.
+func (self RegisterMask) String() string {
+ if !self.Z {
+ return fmt.Sprintf("{%%%s}", self.K)
+ } else {
+ return fmt.Sprintf("{%%%s}{z}", self.K)
+ }
+}
+
+// MaskedRegister is a Register masked by a RegisterMask.
+type MaskedRegister struct {
+ Reg Register
+ Mask RegisterMask
+}
+
+// String implements the fmt.Stringer interface.
+func (self MaskedRegister) String() string {
+ return self.Reg.String() + self.Mask.String()
+}
+
+const (
+ AL Register8 = iota
+ CL
+ DL
+ BL
+ SPL
+ BPL
+ SIL
+ DIL
+ R8b
+ R9b
+ R10b
+ R11b
+ R12b
+ R13b
+ R14b
+ R15b
+)
+
+const (
+ AH = SPL | 0x80
+ CH = BPL | 0x80
+ DH = SIL | 0x80
+ BH = DIL | 0x80
+)
+
+const (
+ AX Register16 = iota
+ CX
+ DX
+ BX
+ SP
+ BP
+ SI
+ DI
+ R8w
+ R9w
+ R10w
+ R11w
+ R12w
+ R13w
+ R14w
+ R15w
+)
+
+const (
+ EAX Register32 = iota
+ ECX
+ EDX
+ EBX
+ ESP
+ EBP
+ ESI
+ EDI
+ R8d
+ R9d
+ R10d
+ R11d
+ R12d
+ R13d
+ R14d
+ R15d
+)
+
+const (
+ RAX Register64 = iota
+ RCX
+ RDX
+ RBX
+ RSP
+ RBP
+ RSI
+ RDI
+ R8
+ R9
+ R10
+ R11
+ R12
+ R13
+ R14
+ R15
+)
+
+const (
+ K0 KRegister = iota
+ K1
+ K2
+ K3
+ K4
+ K5
+ K6
+ K7
+)
+
+const (
+ MM0 MMRegister = iota
+ MM1
+ MM2
+ MM3
+ MM4
+ MM5
+ MM6
+ MM7
+)
+
+const (
+ XMM0 XMMRegister = iota
+ XMM1
+ XMM2
+ XMM3
+ XMM4
+ XMM5
+ XMM6
+ XMM7
+ XMM8
+ XMM9
+ XMM10
+ XMM11
+ XMM12
+ XMM13
+ XMM14
+ XMM15
+ XMM16
+ XMM17
+ XMM18
+ XMM19
+ XMM20
+ XMM21
+ XMM22
+ XMM23
+ XMM24
+ XMM25
+ XMM26
+ XMM27
+ XMM28
+ XMM29
+ XMM30
+ XMM31
+)
+
+const (
+ YMM0 YMMRegister = iota
+ YMM1
+ YMM2
+ YMM3
+ YMM4
+ YMM5
+ YMM6
+ YMM7
+ YMM8
+ YMM9
+ YMM10
+ YMM11
+ YMM12
+ YMM13
+ YMM14
+ YMM15
+ YMM16
+ YMM17
+ YMM18
+ YMM19
+ YMM20
+ YMM21
+ YMM22
+ YMM23
+ YMM24
+ YMM25
+ YMM26
+ YMM27
+ YMM28
+ YMM29
+ YMM30
+ YMM31
+)
+
+const (
+ ZMM0 ZMMRegister = iota
+ ZMM1
+ ZMM2
+ ZMM3
+ ZMM4
+ ZMM5
+ ZMM6
+ ZMM7
+ ZMM8
+ ZMM9
+ ZMM10
+ ZMM11
+ ZMM12
+ ZMM13
+ ZMM14
+ ZMM15
+ ZMM16
+ ZMM17
+ ZMM18
+ ZMM19
+ ZMM20
+ ZMM21
+ ZMM22
+ ZMM23
+ ZMM24
+ ZMM25
+ ZMM26
+ ZMM27
+ ZMM28
+ ZMM29
+ ZMM30
+ ZMM31
+)
+
+func (self Register8) implRegister() {}
+func (self Register16) implRegister() {}
+func (self Register32) implRegister() {}
+func (self Register64) implRegister() {}
+
+func (self KRegister) implRegister() {}
+func (self MMRegister) implRegister() {}
+func (self XMMRegister) implRegister() {}
+func (self YMMRegister) implRegister() {}
+func (self ZMMRegister) implRegister() {}
+
+func (self Register8) String() string { if int(self) >= len(r8names) { return "???" } else { return r8names[self] } }
+func (self Register16) String() string { if int(self) >= len(r16names) { return "???" } else { return r16names[self] } }
+func (self Register32) String() string { if int(self) >= len(r32names) { return "???" } else { return r32names[self] } }
+func (self Register64) String() string { if int(self) >= len(r64names) { return "???" } else { return r64names[self] } }
+
+func (self KRegister) String() string { if int(self) >= len(knames) { return "???" } else { return knames[self] } }
+func (self MMRegister) String() string { if int(self) >= len(mmnames) { return "???" } else { return mmnames[self] } }
+func (self XMMRegister) String() string { if int(self) >= len(xmmnames) { return "???" } else { return xmmnames[self] } }
+func (self YMMRegister) String() string { if int(self) >= len(ymmnames) { return "???" } else { return ymmnames[self] } }
+func (self ZMMRegister) String() string { if int(self) >= len(zmmnames) { return "???" } else { return zmmnames[self] } }
+
+// Registers maps register name into Register instances.
+var Registers = map[string]Register {
+ "al" : AL,
+ "cl" : CL,
+ "dl" : DL,
+ "bl" : BL,
+ "spl" : SPL,
+ "bpl" : BPL,
+ "sil" : SIL,
+ "dil" : DIL,
+ "r8b" : R8b,
+ "r9b" : R9b,
+ "r10b" : R10b,
+ "r11b" : R11b,
+ "r12b" : R12b,
+ "r13b" : R13b,
+ "r14b" : R14b,
+ "r15b" : R15b,
+ "ah" : AH,
+ "ch" : CH,
+ "dh" : DH,
+ "bh" : BH,
+ "ax" : AX,
+ "cx" : CX,
+ "dx" : DX,
+ "bx" : BX,
+ "sp" : SP,
+ "bp" : BP,
+ "si" : SI,
+ "di" : DI,
+ "r8w" : R8w,
+ "r9w" : R9w,
+ "r10w" : R10w,
+ "r11w" : R11w,
+ "r12w" : R12w,
+ "r13w" : R13w,
+ "r14w" : R14w,
+ "r15w" : R15w,
+ "eax" : EAX,
+ "ecx" : ECX,
+ "edx" : EDX,
+ "ebx" : EBX,
+ "esp" : ESP,
+ "ebp" : EBP,
+ "esi" : ESI,
+ "edi" : EDI,
+ "r8d" : R8d,
+ "r9d" : R9d,
+ "r10d" : R10d,
+ "r11d" : R11d,
+ "r12d" : R12d,
+ "r13d" : R13d,
+ "r14d" : R14d,
+ "r15d" : R15d,
+ "rax" : RAX,
+ "rcx" : RCX,
+ "rdx" : RDX,
+ "rbx" : RBX,
+ "rsp" : RSP,
+ "rbp" : RBP,
+ "rsi" : RSI,
+ "rdi" : RDI,
+ "r8" : R8,
+ "r9" : R9,
+ "r10" : R10,
+ "r11" : R11,
+ "r12" : R12,
+ "r13" : R13,
+ "r14" : R14,
+ "r15" : R15,
+ "k0" : K0,
+ "k1" : K1,
+ "k2" : K2,
+ "k3" : K3,
+ "k4" : K4,
+ "k5" : K5,
+ "k6" : K6,
+ "k7" : K7,
+ "mm0" : MM0,
+ "mm1" : MM1,
+ "mm2" : MM2,
+ "mm3" : MM3,
+ "mm4" : MM4,
+ "mm5" : MM5,
+ "mm6" : MM6,
+ "mm7" : MM7,
+ "xmm0" : XMM0,
+ "xmm1" : XMM1,
+ "xmm2" : XMM2,
+ "xmm3" : XMM3,
+ "xmm4" : XMM4,
+ "xmm5" : XMM5,
+ "xmm6" : XMM6,
+ "xmm7" : XMM7,
+ "xmm8" : XMM8,
+ "xmm9" : XMM9,
+ "xmm10" : XMM10,
+ "xmm11" : XMM11,
+ "xmm12" : XMM12,
+ "xmm13" : XMM13,
+ "xmm14" : XMM14,
+ "xmm15" : XMM15,
+ "xmm16" : XMM16,
+ "xmm17" : XMM17,
+ "xmm18" : XMM18,
+ "xmm19" : XMM19,
+ "xmm20" : XMM20,
+ "xmm21" : XMM21,
+ "xmm22" : XMM22,
+ "xmm23" : XMM23,
+ "xmm24" : XMM24,
+ "xmm25" : XMM25,
+ "xmm26" : XMM26,
+ "xmm27" : XMM27,
+ "xmm28" : XMM28,
+ "xmm29" : XMM29,
+ "xmm30" : XMM30,
+ "xmm31" : XMM31,
+ "ymm0" : YMM0,
+ "ymm1" : YMM1,
+ "ymm2" : YMM2,
+ "ymm3" : YMM3,
+ "ymm4" : YMM4,
+ "ymm5" : YMM5,
+ "ymm6" : YMM6,
+ "ymm7" : YMM7,
+ "ymm8" : YMM8,
+ "ymm9" : YMM9,
+ "ymm10" : YMM10,
+ "ymm11" : YMM11,
+ "ymm12" : YMM12,
+ "ymm13" : YMM13,
+ "ymm14" : YMM14,
+ "ymm15" : YMM15,
+ "ymm16" : YMM16,
+ "ymm17" : YMM17,
+ "ymm18" : YMM18,
+ "ymm19" : YMM19,
+ "ymm20" : YMM20,
+ "ymm21" : YMM21,
+ "ymm22" : YMM22,
+ "ymm23" : YMM23,
+ "ymm24" : YMM24,
+ "ymm25" : YMM25,
+ "ymm26" : YMM26,
+ "ymm27" : YMM27,
+ "ymm28" : YMM28,
+ "ymm29" : YMM29,
+ "ymm30" : YMM30,
+ "ymm31" : YMM31,
+ "zmm0" : ZMM0,
+ "zmm1" : ZMM1,
+ "zmm2" : ZMM2,
+ "zmm3" : ZMM3,
+ "zmm4" : ZMM4,
+ "zmm5" : ZMM5,
+ "zmm6" : ZMM6,
+ "zmm7" : ZMM7,
+ "zmm8" : ZMM8,
+ "zmm9" : ZMM9,
+ "zmm10" : ZMM10,
+ "zmm11" : ZMM11,
+ "zmm12" : ZMM12,
+ "zmm13" : ZMM13,
+ "zmm14" : ZMM14,
+ "zmm15" : ZMM15,
+ "zmm16" : ZMM16,
+ "zmm17" : ZMM17,
+ "zmm18" : ZMM18,
+ "zmm19" : ZMM19,
+ "zmm20" : ZMM20,
+ "zmm21" : ZMM21,
+ "zmm22" : ZMM22,
+ "zmm23" : ZMM23,
+ "zmm24" : ZMM24,
+ "zmm25" : ZMM25,
+ "zmm26" : ZMM26,
+ "zmm27" : ZMM27,
+ "zmm28" : ZMM28,
+ "zmm29" : ZMM29,
+ "zmm30" : ZMM30,
+ "zmm31" : ZMM31,
+}
+
+/** Register Name Tables **/
+
+var r8names = [...]string {
+ AL : "al",
+ CL : "cl",
+ DL : "dl",
+ BL : "bl",
+ SPL : "spl",
+ BPL : "bpl",
+ SIL : "sil",
+ DIL : "dil",
+ R8b : "r8b",
+ R9b : "r9b",
+ R10b : "r10b",
+ R11b : "r11b",
+ R12b : "r12b",
+ R13b : "r13b",
+ R14b : "r14b",
+ R15b : "r15b",
+ AH : "ah",
+ CH : "ch",
+ DH : "dh",
+ BH : "bh",
+}
+
+var r16names = [...]string {
+ AX : "ax",
+ CX : "cx",
+ DX : "dx",
+ BX : "bx",
+ SP : "sp",
+ BP : "bp",
+ SI : "si",
+ DI : "di",
+ R8w : "r8w",
+ R9w : "r9w",
+ R10w : "r10w",
+ R11w : "r11w",
+ R12w : "r12w",
+ R13w : "r13w",
+ R14w : "r14w",
+ R15w : "r15w",
+}
+
+var r32names = [...]string {
+ EAX : "eax",
+ ECX : "ecx",
+ EDX : "edx",
+ EBX : "ebx",
+ ESP : "esp",
+ EBP : "ebp",
+ ESI : "esi",
+ EDI : "edi",
+ R8d : "r8d",
+ R9d : "r9d",
+ R10d : "r10d",
+ R11d : "r11d",
+ R12d : "r12d",
+ R13d : "r13d",
+ R14d : "r14d",
+ R15d : "r15d",
+}
+
+var r64names = [...]string {
+ RAX : "rax",
+ RCX : "rcx",
+ RDX : "rdx",
+ RBX : "rbx",
+ RSP : "rsp",
+ RBP : "rbp",
+ RSI : "rsi",
+ RDI : "rdi",
+ R8 : "r8",
+ R9 : "r9",
+ R10 : "r10",
+ R11 : "r11",
+ R12 : "r12",
+ R13 : "r13",
+ R14 : "r14",
+ R15 : "r15",
+}
+
+var knames = [...]string {
+ K0: "k0",
+ K1: "k1",
+ K2: "k2",
+ K3: "k3",
+ K4: "k4",
+ K5: "k5",
+ K6: "k6",
+ K7: "k7",
+}
+
+var mmnames = [...]string {
+ MM0: "mm0",
+ MM1: "mm1",
+ MM2: "mm2",
+ MM3: "mm3",
+ MM4: "mm4",
+ MM5: "mm5",
+ MM6: "mm6",
+ MM7: "mm7",
+}
+
+var xmmnames = [...]string {
+ XMM0 : "xmm0",
+ XMM1 : "xmm1",
+ XMM2 : "xmm2",
+ XMM3 : "xmm3",
+ XMM4 : "xmm4",
+ XMM5 : "xmm5",
+ XMM6 : "xmm6",
+ XMM7 : "xmm7",
+ XMM8 : "xmm8",
+ XMM9 : "xmm9",
+ XMM10 : "xmm10",
+ XMM11 : "xmm11",
+ XMM12 : "xmm12",
+ XMM13 : "xmm13",
+ XMM14 : "xmm14",
+ XMM15 : "xmm15",
+ XMM16 : "xmm16",
+ XMM17 : "xmm17",
+ XMM18 : "xmm18",
+ XMM19 : "xmm19",
+ XMM20 : "xmm20",
+ XMM21 : "xmm21",
+ XMM22 : "xmm22",
+ XMM23 : "xmm23",
+ XMM24 : "xmm24",
+ XMM25 : "xmm25",
+ XMM26 : "xmm26",
+ XMM27 : "xmm27",
+ XMM28 : "xmm28",
+ XMM29 : "xmm29",
+ XMM30 : "xmm30",
+ XMM31 : "xmm31",
+}
+
+var ymmnames = [...]string {
+ YMM0 : "ymm0",
+ YMM1 : "ymm1",
+ YMM2 : "ymm2",
+ YMM3 : "ymm3",
+ YMM4 : "ymm4",
+ YMM5 : "ymm5",
+ YMM6 : "ymm6",
+ YMM7 : "ymm7",
+ YMM8 : "ymm8",
+ YMM9 : "ymm9",
+ YMM10 : "ymm10",
+ YMM11 : "ymm11",
+ YMM12 : "ymm12",
+ YMM13 : "ymm13",
+ YMM14 : "ymm14",
+ YMM15 : "ymm15",
+ YMM16 : "ymm16",
+ YMM17 : "ymm17",
+ YMM18 : "ymm18",
+ YMM19 : "ymm19",
+ YMM20 : "ymm20",
+ YMM21 : "ymm21",
+ YMM22 : "ymm22",
+ YMM23 : "ymm23",
+ YMM24 : "ymm24",
+ YMM25 : "ymm25",
+ YMM26 : "ymm26",
+ YMM27 : "ymm27",
+ YMM28 : "ymm28",
+ YMM29 : "ymm29",
+ YMM30 : "ymm30",
+ YMM31 : "ymm31",
+}
+
+var zmmnames = [...]string {
+ ZMM0 : "zmm0",
+ ZMM1 : "zmm1",
+ ZMM2 : "zmm2",
+ ZMM3 : "zmm3",
+ ZMM4 : "zmm4",
+ ZMM5 : "zmm5",
+ ZMM6 : "zmm6",
+ ZMM7 : "zmm7",
+ ZMM8 : "zmm8",
+ ZMM9 : "zmm9",
+ ZMM10 : "zmm10",
+ ZMM11 : "zmm11",
+ ZMM12 : "zmm12",
+ ZMM13 : "zmm13",
+ ZMM14 : "zmm14",
+ ZMM15 : "zmm15",
+ ZMM16 : "zmm16",
+ ZMM17 : "zmm17",
+ ZMM18 : "zmm18",
+ ZMM19 : "zmm19",
+ ZMM20 : "zmm20",
+ ZMM21 : "zmm21",
+ ZMM22 : "zmm22",
+ ZMM23 : "zmm23",
+ ZMM24 : "zmm24",
+ ZMM25 : "zmm25",
+ ZMM26 : "zmm26",
+ ZMM27 : "zmm27",
+ ZMM28 : "zmm28",
+ ZMM29 : "zmm29",
+ ZMM30 : "zmm30",
+ ZMM31 : "zmm31",
+}