-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmodifiers.go
106 lines (94 loc) · 2.87 KB
/
modifiers.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
106
package arm
// Modifier identifiers
const (
_ uint8 = iota
SymLSL
SymLSR
SymASR
SymROR
SymMSL
SymSXTX
SymSXTW
SymSXTH
SymSXTB
SymUXTX
SymUXTW
SymUXTH
SymUXTB
)
// Modifier lists
const (
_ uint8 = iota
SymExtends
SymExtendsW
SymExtendsX
SymShifts
SymRotates
)
// Modifiers
var (
ModSXTX = Mod{ID: SymSXTX} // ModSXTX is an extension modifier argument with ID SymSXTX
ModSXTW = Mod{ID: SymSXTW} // ModSXTW is an extension modifier argument with ID SymSXTW
ModSXTH = Mod{ID: SymSXTH} // ModSXTH is an extension modifier argument with ID SymSXTH
ModSXTB = Mod{ID: SymSXTB} // ModSXTB is an extension modifier argument with ID SymSXTB
ModUXTX = Mod{ID: SymUXTX} // ModUXTX is an extension modifier argument with ID SymUXTX
ModUXTW = Mod{ID: SymUXTW} // ModUXTW is an extension modifier argument with ID SymUXTW
ModUXTH = Mod{ID: SymUXTH} // ModUXTH is an extension modifier argument with ID SymUXTH
ModUXTB = Mod{ID: SymUXTB} // ModUXTB is an extension modifier argument with ID SymUXTB
ModLSL = Mod{ID: SymLSL} // ModLSL is a shift modifier argument with ID SymLSL
ModLSR = Mod{ID: SymLSR} // ModLSR is a shift modifier argument with ID SymLSR
ModASR = Mod{ID: SymASR} // ModASR is a shift modifier argument with ID SymASR
ModROR = Mod{ID: SymROR} // ModROR is a rotate modifier argument with ID SymROR
ModMSL = Mod{ID: SymMSL} // ModMSL is a shift modifier argument with ID SymMSL
)
// Imm constructs a modifier argument from m with an immediate shift or rotate amount.
func (m Mod) Imm(i uint8) Mod { return Mod{ID: m.ID, ImmInv: ^i} }
// HasImm returns true if an immediate shift or rotate amount is set for m.
func (m Mod) HasImm() bool { return m.ImmInv != 0 }
// GetImm returns the immediate shift or rotate amount for m. The amount is only valid if HasImm returns true.
func (m Mod) GetImm() uint8 { return ^m.ImmInv }
// ModList contains grouped modifier symbols.
var ModList = [...][]uint8{
SymExtends: {SymUXTB, SymUXTH, SymUXTW, SymUXTX, SymSXTB, SymSXTH, SymSXTW, SymSXTX, SymLSL},
SymExtendsW: {SymUXTB, SymUXTH, SymUXTW, SymSXTB, SymSXTH, SymSXTW},
SymExtendsX: {SymUXTX, SymSXTX, SymLSL},
SymShifts: {SymLSL, SymLSR, SymASR},
SymRotates: {SymLSL, SymLSR, SymASR, SymROR},
}
var ModListName = [...]string{
SymExtends: "SymExtends",
SymExtendsW: "SymExtendsW",
SymExtendsX: "SymExtendsX",
SymShifts: "SymShifts",
SymRotates: "SymRotates",
}
var ModName = [...]string{
SymLSL: "SymLSL",
SymLSR: "SymLSR",
SymASR: "SymASR",
SymROR: "SymROR",
SymSXTX: "SymSXTX",
SymSXTW: "SymSXTW",
SymSXTH: "SymSXTH",
SymSXTB: "SymSXTB",
SymUXTX: "SymUXTX",
SymUXTW: "SymUXTW",
SymUXTH: "SymUXTH",
SymUXTB: "SymUXTB",
SymMSL: "SymMSL",
}
var ModRequiresImm = [...]bool{
SymLSL: true,
SymLSR: true,
SymASR: true,
SymROR: true,
SymMSL: true,
}
func checkMod(list []uint8, id uint8) bool {
for _, x := range list {
if id == x {
return true
}
}
return false
}