constants-aarch32.h revision 7f4a230cbb795755d24e1d4658e99a7ccf1eb24b
1// Copyright 2015, VIXL authors
2// All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are met:
6//
7//   * Redistributions of source code must retain the above copyright notice,
8//     this list of conditions and the following disclaimer.
9//   * Redistributions in binary form must reproduce the above copyright
10//     notice, this list of conditions and the following disclaimer in the
11//     documentation and/or other materials provided with the distribution.
12//   * Neither the name of ARM Limited nor the names of its contributors may
13//     be used to endorse or promote products derived from this software
14//     without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
17// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26// POSSIBILITY OF SUCH DAMAGE.
27
28#ifndef VIXL_CONSTANTS_AARCH32_H_
29#define VIXL_CONSTANTS_AARCH32_H_
30
31extern "C" {
32#include <stdint.h>
33}
34
35namespace vixl {
36namespace aarch32 {
37
38const unsigned kRegSizeInBits = 32;
39const unsigned kRegSizeInBytes = kRegSizeInBits / 8;
40const unsigned kSRegSizeInBits = 32;
41const unsigned kSRegSizeInBytes = kSRegSizeInBits / 8;
42const unsigned kDRegSizeInBits = 64;
43const unsigned kDRegSizeInBytes = kDRegSizeInBits / 8;
44const unsigned kQRegSizeInBits = 128;
45const unsigned kQRegSizeInBytes = kQRegSizeInBits / 8;
46
47const unsigned kNumberOfRegisters = 16;
48const unsigned kNumberOfSRegisters = 32;
49const unsigned kMaxNumberOfDRegisters = 32;
50const unsigned kNumberOfQRegisters = 16;
51const unsigned kNumberOfT32LowRegisters = 8;
52
53const unsigned kIpCode = 12;
54const unsigned kSpCode = 13;
55const unsigned kLrCode = 14;
56const unsigned kPcCode = 15;
57
58const unsigned kT32PcDelta = 4;
59const unsigned kA32PcDelta = 8;
60
61const unsigned kRRXEncodedValue = 3;
62
63const unsigned kCoprocMask = 0xe;
64const unsigned kInvalidCoprocMask = 0xa;
65
66const unsigned kLowestT32_32Opcode = 0xe8000000;
67
68const uint32_t kUnknownValue = 0xdeadbeef;
69
70const uint32_t kMaxInstructionSizeInBytes = 4;
71const uint32_t kA32InstructionSizeInBytes = 4;
72const uint32_t k32BitT32InstructionSizeInBytes = 4;
73const uint32_t k16BitT32InstructionSizeInBytes = 2;
74
75// Maximum size emitted by a single T32 unconditional macro-instruction.
76const uint32_t kMaxT32MacroInstructionSizeInBytes = 32;
77
78const uint32_t kCallerSavedRegistersMask = 0x500f;
79
80enum SystemFunctionsOpcodes { kPrintfCode };
81
82// Start of generated code.
83enum InstructionAttribute {
84  kNoAttribute = 0,
85  kArithmetic = 0x1,
86  kBitwise = 0x2,
87  kShift = 0x4,
88  kAddress = 0x8,
89  kBranch = 0x10,
90  kSystem = 0x20,
91  kFpNeon = 0x40,
92  kLoadStore = 0x80,
93  kLoadStoreMultiple = 0x100
94};
95
96enum InstructionType {
97  kUndefInstructionType,
98  kAdc,
99  kAdcs,
100  kAdd,
101  kAdds,
102  kAddw,
103  kAdr,
104  kAnd,
105  kAnds,
106  kAsr,
107  kAsrs,
108  kB,
109  kBfc,
110  kBfi,
111  kBic,
112  kBics,
113  kBkpt,
114  kBl,
115  kBlx,
116  kBx,
117  kBxj,
118  kCbnz,
119  kCbz,
120  kClrex,
121  kClz,
122  kCmn,
123  kCmp,
124  kCrc32b,
125  kCrc32cb,
126  kCrc32ch,
127  kCrc32cw,
128  kCrc32h,
129  kCrc32w,
130  kDmb,
131  kDsb,
132  kEor,
133  kEors,
134  kFldmdbx,
135  kFldmiax,
136  kFstmdbx,
137  kFstmiax,
138  kHlt,
139  kHvc,
140  kIsb,
141  kIt,
142  kLda,
143  kLdab,
144  kLdaex,
145  kLdaexb,
146  kLdaexd,
147  kLdaexh,
148  kLdah,
149  kLdm,
150  kLdmda,
151  kLdmdb,
152  kLdmea,
153  kLdmed,
154  kLdmfa,
155  kLdmfd,
156  kLdmib,
157  kLdr,
158  kLdrb,
159  kLdrd,
160  kLdrex,
161  kLdrexb,
162  kLdrexd,
163  kLdrexh,
164  kLdrh,
165  kLdrsb,
166  kLdrsh,
167  kLsl,
168  kLsls,
169  kLsr,
170  kLsrs,
171  kMla,
172  kMlas,
173  kMls,
174  kMov,
175  kMovs,
176  kMovt,
177  kMovw,
178  kMrs,
179  kMsr,
180  kMul,
181  kMuls,
182  kMvn,
183  kMvns,
184  kNop,
185  kOrn,
186  kOrns,
187  kOrr,
188  kOrrs,
189  kPkhbt,
190  kPkhtb,
191  kPld,
192  kPldw,
193  kPli,
194  kPop,
195  kPush,
196  kQadd,
197  kQadd16,
198  kQadd8,
199  kQasx,
200  kQdadd,
201  kQdsub,
202  kQsax,
203  kQsub,
204  kQsub16,
205  kQsub8,
206  kRbit,
207  kRev,
208  kRev16,
209  kRevsh,
210  kRor,
211  kRors,
212  kRrx,
213  kRrxs,
214  kRsb,
215  kRsbs,
216  kRsc,
217  kRscs,
218  kSadd16,
219  kSadd8,
220  kSasx,
221  kSbc,
222  kSbcs,
223  kSbfx,
224  kSdiv,
225  kSel,
226  kShadd16,
227  kShadd8,
228  kShasx,
229  kShsax,
230  kShsub16,
231  kShsub8,
232  kSmlabb,
233  kSmlabt,
234  kSmlad,
235  kSmladx,
236  kSmlal,
237  kSmlalbb,
238  kSmlalbt,
239  kSmlald,
240  kSmlaldx,
241  kSmlals,
242  kSmlaltb,
243  kSmlaltt,
244  kSmlatb,
245  kSmlatt,
246  kSmlawb,
247  kSmlawt,
248  kSmlsd,
249  kSmlsdx,
250  kSmlsld,
251  kSmlsldx,
252  kSmmla,
253  kSmmlar,
254  kSmmls,
255  kSmmlsr,
256  kSmmul,
257  kSmmulr,
258  kSmuad,
259  kSmuadx,
260  kSmulbb,
261  kSmulbt,
262  kSmull,
263  kSmulls,
264  kSmultb,
265  kSmultt,
266  kSmulwb,
267  kSmulwt,
268  kSmusd,
269  kSmusdx,
270  kSsat,
271  kSsat16,
272  kSsax,
273  kSsub16,
274  kSsub8,
275  kStl,
276  kStlb,
277  kStlex,
278  kStlexb,
279  kStlexd,
280  kStlexh,
281  kStlh,
282  kStm,
283  kStmda,
284  kStmdb,
285  kStmea,
286  kStmed,
287  kStmfa,
288  kStmfd,
289  kStmib,
290  kStr,
291  kStrb,
292  kStrd,
293  kStrex,
294  kStrexb,
295  kStrexd,
296  kStrexh,
297  kStrh,
298  kSub,
299  kSubs,
300  kSubw,
301  kSvc,
302  kSxtab,
303  kSxtab16,
304  kSxtah,
305  kSxtb,
306  kSxtb16,
307  kSxth,
308  kTbb,
309  kTbh,
310  kTeq,
311  kTst,
312  kUadd16,
313  kUadd8,
314  kUasx,
315  kUbfx,
316  kUdf,
317  kUdiv,
318  kUhadd16,
319  kUhadd8,
320  kUhasx,
321  kUhsax,
322  kUhsub16,
323  kUhsub8,
324  kUmaal,
325  kUmlal,
326  kUmlals,
327  kUmull,
328  kUmulls,
329  kUqadd16,
330  kUqadd8,
331  kUqasx,
332  kUqsax,
333  kUqsub16,
334  kUqsub8,
335  kUsad8,
336  kUsada8,
337  kUsat,
338  kUsat16,
339  kUsax,
340  kUsub16,
341  kUsub8,
342  kUxtab,
343  kUxtab16,
344  kUxtah,
345  kUxtb,
346  kUxtb16,
347  kUxth,
348  kVaba,
349  kVabal,
350  kVabd,
351  kVabdl,
352  kVabs,
353  kVacge,
354  kVacgt,
355  kVacle,
356  kVaclt,
357  kVadd,
358  kVaddhn,
359  kVaddl,
360  kVaddw,
361  kVand,
362  kVbic,
363  kVbif,
364  kVbit,
365  kVbsl,
366  kVceq,
367  kVcge,
368  kVcgt,
369  kVcle,
370  kVcls,
371  kVclt,
372  kVclz,
373  kVcmp,
374  kVcmpe,
375  kVcnt,
376  kVcvt,
377  kVcvta,
378  kVcvtb,
379  kVcvtm,
380  kVcvtn,
381  kVcvtp,
382  kVcvtr,
383  kVcvtt,
384  kVdiv,
385  kVdup,
386  kVeor,
387  kVext,
388  kVfma,
389  kVfms,
390  kVfnma,
391  kVfnms,
392  kVhadd,
393  kVhsub,
394  kVld1,
395  kVld2,
396  kVld3,
397  kVld4,
398  kVldm,
399  kVldmdb,
400  kVldmia,
401  kVldr,
402  kVmax,
403  kVmaxnm,
404  kVmin,
405  kVminnm,
406  kVmla,
407  kVmlal,
408  kVmls,
409  kVmlsl,
410  kVmov,
411  kVmovl,
412  kVmovn,
413  kVmrs,
414  kVmsr,
415  kVmul,
416  kVmull,
417  kVmvn,
418  kVneg,
419  kVnmla,
420  kVnmls,
421  kVnmul,
422  kVorn,
423  kVorr,
424  kVpadal,
425  kVpadd,
426  kVpaddl,
427  kVpmax,
428  kVpmin,
429  kVpop,
430  kVpush,
431  kVqabs,
432  kVqadd,
433  kVqdmlal,
434  kVqdmlsl,
435  kVqdmulh,
436  kVqdmull,
437  kVqmovn,
438  kVqmovun,
439  kVqneg,
440  kVqrdmulh,
441  kVqrshl,
442  kVqrshrn,
443  kVqrshrun,
444  kVqshl,
445  kVqshlu,
446  kVqshrn,
447  kVqshrun,
448  kVqsub,
449  kVraddhn,
450  kVrecpe,
451  kVrecps,
452  kVrev16,
453  kVrev32,
454  kVrev64,
455  kVrhadd,
456  kVrinta,
457  kVrintm,
458  kVrintn,
459  kVrintp,
460  kVrintr,
461  kVrintx,
462  kVrintz,
463  kVrshl,
464  kVrshr,
465  kVrshrn,
466  kVrsqrte,
467  kVrsqrts,
468  kVrsra,
469  kVrsubhn,
470  kVseleq,
471  kVselge,
472  kVselgt,
473  kVselvs,
474  kVshl,
475  kVshll,
476  kVshr,
477  kVshrn,
478  kVsli,
479  kVsqrt,
480  kVsra,
481  kVsri,
482  kVst1,
483  kVst2,
484  kVst3,
485  kVst4,
486  kVstm,
487  kVstmdb,
488  kVstmia,
489  kVstr,
490  kVsub,
491  kVsubhn,
492  kVsubl,
493  kVsubw,
494  kVswp,
495  kVtbl,
496  kVtbx,
497  kVtrn,
498  kVtst,
499  kVuzp,
500  kVzip,
501  kYield
502};
503// End of generated code.
504
505inline InstructionAttribute operator|(InstructionAttribute left,
506                                      InstructionAttribute right) {
507  return static_cast<InstructionAttribute>(static_cast<uint32_t>(left) |
508                                           static_cast<uint32_t>(right));
509}
510
511}  // namespace aarch32
512}  // namespace vixl
513
514#endif  // VIXL_CONSTANTS_AARCH32_H_
515