• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
31 extern "C" {
32 #include <stdint.h>
33 }
34 
35 #include "globals-vixl.h"
36 
37 
38 namespace vixl {
39 namespace aarch32 {
40 
41 enum InstructionSet { A32, T32 };
42 #ifdef VIXL_INCLUDE_TARGET_T32_ONLY
43 const InstructionSet kDefaultISA = T32;
44 #else
45 const InstructionSet kDefaultISA = A32;
46 #endif
47 
48 const unsigned kRegSizeInBits = 32;
49 const unsigned kRegSizeInBytes = kRegSizeInBits / 8;
50 const unsigned kSRegSizeInBits = 32;
51 const unsigned kSRegSizeInBytes = kSRegSizeInBits / 8;
52 const unsigned kDRegSizeInBits = 64;
53 const unsigned kDRegSizeInBytes = kDRegSizeInBits / 8;
54 const unsigned kQRegSizeInBits = 128;
55 const unsigned kQRegSizeInBytes = kQRegSizeInBits / 8;
56 
57 const unsigned kNumberOfRegisters = 16;
58 const unsigned kNumberOfSRegisters = 32;
59 const unsigned kMaxNumberOfDRegisters = 32;
60 const unsigned kNumberOfQRegisters = 16;
61 const unsigned kNumberOfT32LowRegisters = 8;
62 
63 const unsigned kIpCode = 12;
64 const unsigned kSpCode = 13;
65 const unsigned kLrCode = 14;
66 const unsigned kPcCode = 15;
67 
68 const unsigned kT32PcDelta = 4;
69 const unsigned kA32PcDelta = 8;
70 
71 const unsigned kRRXEncodedValue = 3;
72 
73 const unsigned kCoprocMask = 0xe;
74 const unsigned kInvalidCoprocMask = 0xa;
75 
76 const unsigned kLowestT32_32Opcode = 0xe8000000;
77 
78 const uint32_t kUnknownValue = 0xdeadbeef;
79 
80 const uint32_t kMaxInstructionSizeInBytes = 4;
81 const uint32_t kA32InstructionSizeInBytes = 4;
82 const uint32_t k32BitT32InstructionSizeInBytes = 4;
83 const uint32_t k16BitT32InstructionSizeInBytes = 2;
84 
85 // Maximum size emitted by a single T32 unconditional macro-instruction.
86 const uint32_t kMaxT32MacroInstructionSizeInBytes = 32;
87 
88 const uint32_t kCallerSavedRegistersMask = 0x500f;
89 
90 const uint16_t k16BitT32NopOpcode = 0xbf00;
91 const uint16_t kCbzCbnzMask = 0xf500;
92 const uint16_t kCbzCbnzValue = 0xb100;
93 
94 const int32_t kCbzCbnzRange = 126;
95 const int32_t kBConditionalNarrowRange = 254;
96 const int32_t kBNarrowRange = 2046;
97 const int32_t kNearLabelRange = kBNarrowRange;
98 
99 enum SystemFunctionsOpcodes { kPrintfCode };
100 
101 enum BranchHint { kNear, kFar, kBranchWithoutHint };
102 
103 // Start of generated code.
104 enum 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 
117 enum 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 
525 const char* ToCString(InstructionType type);
526 // End of generated code.
527 
528 inline 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