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