1
2
3
4
5 package sys
6
7 import (
8 "encoding/binary"
9 "internal/goarch"
10 )
11
12
13 type ArchFamily = goarch.ArchFamilyType
14
15 const (
16 AMD64 = goarch.AMD64
17 ARM = goarch.ARM
18 ARM64 = goarch.ARM64
19 I386 = goarch.I386
20 Loong64 = goarch.LOONG64
21 MIPS = goarch.MIPS
22 MIPS64 = goarch.MIPS64
23 PPC64 = goarch.PPC64
24 RISCV64 = goarch.RISCV64
25 S390X = goarch.S390X
26 Wasm = goarch.WASM
27 )
28
29
30 type Arch struct {
31 Name string
32 Family ArchFamily
33
34 ByteOrder binary.ByteOrder
35
36
37
38 PtrSize int
39
40
41 RegSize int
42
43
44 MinLC int
45
46
47
48
49
50 Alignment int8
51
52
53
54
55 CanMergeLoads bool
56
57
58
59 CanJumpTable bool
60
61
62
63 HasLR bool
64
65
66
67
68
69
70
71 FixedFrameSize int64
72 }
73
74
75
76 func (a *Arch) InFamily(xs ...ArchFamily) bool {
77 for _, x := range xs {
78 if a.Family == x {
79 return true
80 }
81 }
82 return false
83 }
84
85 var Arch386 = &Arch{
86 Name: "386",
87 Family: I386,
88 ByteOrder: binary.LittleEndian,
89 PtrSize: 4,
90 RegSize: 4,
91 MinLC: 1,
92 Alignment: 1,
93 CanMergeLoads: true,
94 HasLR: false,
95 FixedFrameSize: 0,
96 }
97
98 var ArchAMD64 = &Arch{
99 Name: "amd64",
100 Family: AMD64,
101 ByteOrder: binary.LittleEndian,
102 PtrSize: 8,
103 RegSize: 8,
104 MinLC: 1,
105 Alignment: 1,
106 CanMergeLoads: true,
107 CanJumpTable: true,
108 HasLR: false,
109 FixedFrameSize: 0,
110 }
111
112 var ArchARM = &Arch{
113 Name: "arm",
114 Family: ARM,
115 ByteOrder: binary.LittleEndian,
116 PtrSize: 4,
117 RegSize: 4,
118 MinLC: 4,
119 Alignment: 4,
120 CanMergeLoads: false,
121 HasLR: true,
122 FixedFrameSize: 4,
123 }
124
125 var ArchARM64 = &Arch{
126 Name: "arm64",
127 Family: ARM64,
128 ByteOrder: binary.LittleEndian,
129 PtrSize: 8,
130 RegSize: 8,
131 MinLC: 4,
132 Alignment: 1,
133 CanMergeLoads: true,
134 CanJumpTable: true,
135 HasLR: true,
136 FixedFrameSize: 8,
137 }
138
139 var ArchLoong64 = &Arch{
140 Name: "loong64",
141 Family: Loong64,
142 ByteOrder: binary.LittleEndian,
143 PtrSize: 8,
144 RegSize: 8,
145 MinLC: 4,
146 Alignment: 8,
147 CanMergeLoads: true,
148 HasLR: true,
149 FixedFrameSize: 8,
150 }
151
152 var ArchMIPS = &Arch{
153 Name: "mips",
154 Family: MIPS,
155 ByteOrder: binary.BigEndian,
156 PtrSize: 4,
157 RegSize: 4,
158 MinLC: 4,
159 Alignment: 4,
160 CanMergeLoads: false,
161 HasLR: true,
162 FixedFrameSize: 4,
163 }
164
165 var ArchMIPSLE = &Arch{
166 Name: "mipsle",
167 Family: MIPS,
168 ByteOrder: binary.LittleEndian,
169 PtrSize: 4,
170 RegSize: 4,
171 MinLC: 4,
172 Alignment: 4,
173 CanMergeLoads: false,
174 HasLR: true,
175 FixedFrameSize: 4,
176 }
177
178 var ArchMIPS64 = &Arch{
179 Name: "mips64",
180 Family: MIPS64,
181 ByteOrder: binary.BigEndian,
182 PtrSize: 8,
183 RegSize: 8,
184 MinLC: 4,
185 Alignment: 8,
186 CanMergeLoads: false,
187 HasLR: true,
188 FixedFrameSize: 8,
189 }
190
191 var ArchMIPS64LE = &Arch{
192 Name: "mips64le",
193 Family: MIPS64,
194 ByteOrder: binary.LittleEndian,
195 PtrSize: 8,
196 RegSize: 8,
197 MinLC: 4,
198 Alignment: 8,
199 CanMergeLoads: false,
200 HasLR: true,
201 FixedFrameSize: 8,
202 }
203
204 var ArchPPC64 = &Arch{
205 Name: "ppc64",
206 Family: PPC64,
207 ByteOrder: binary.BigEndian,
208 PtrSize: 8,
209 RegSize: 8,
210 MinLC: 4,
211 Alignment: 1,
212 CanMergeLoads: true,
213 HasLR: true,
214
215
216 FixedFrameSize: 4 * 8,
217 }
218
219 var ArchPPC64LE = &Arch{
220 Name: "ppc64le",
221 Family: PPC64,
222 ByteOrder: binary.LittleEndian,
223 PtrSize: 8,
224 RegSize: 8,
225 MinLC: 4,
226 Alignment: 1,
227 CanMergeLoads: true,
228 HasLR: true,
229 FixedFrameSize: 4 * 8,
230 }
231
232 var ArchRISCV64 = &Arch{
233 Name: "riscv64",
234 Family: RISCV64,
235 ByteOrder: binary.LittleEndian,
236 PtrSize: 8,
237 RegSize: 8,
238 MinLC: 4,
239 Alignment: 8,
240 CanMergeLoads: false,
241 HasLR: true,
242 FixedFrameSize: 8,
243 }
244
245 var ArchS390X = &Arch{
246 Name: "s390x",
247 Family: S390X,
248 ByteOrder: binary.BigEndian,
249 PtrSize: 8,
250 RegSize: 8,
251 MinLC: 2,
252 Alignment: 1,
253 CanMergeLoads: true,
254 HasLR: true,
255 FixedFrameSize: 8,
256 }
257
258 var ArchWasm = &Arch{
259 Name: "wasm",
260 Family: Wasm,
261 ByteOrder: binary.LittleEndian,
262 PtrSize: 8,
263 RegSize: 8,
264 MinLC: 1,
265 Alignment: 1,
266 CanMergeLoads: false,
267 HasLR: false,
268 FixedFrameSize: 0,
269 }
270
271 var Archs = [...]*Arch{
272 Arch386,
273 ArchAMD64,
274 ArchARM,
275 ArchARM64,
276 ArchLoong64,
277 ArchMIPS,
278 ArchMIPSLE,
279 ArchMIPS64,
280 ArchMIPS64LE,
281 ArchPPC64,
282 ArchPPC64LE,
283 ArchRISCV64,
284 ArchS390X,
285 ArchWasm,
286 }
287
View as plain text