/src/capstonev5/arch/AArch64/AArch64BaseInfo.c
Line | Count | Source (jump to first uncovered line) |
1 | | //===-- AArch64BaseInfo.cpp - AArch64 Base encoding information------------===// |
2 | | // |
3 | | // The LLVM Compiler Infrastructure |
4 | | // |
5 | | // This file is distributed under the University of Illinois Open Source |
6 | | // License. See LICENSE.TXT for details. |
7 | | // |
8 | | //===----------------------------------------------------------------------===// |
9 | | // |
10 | | // This file provides basic encoding and assembly information for AArch64. |
11 | | // |
12 | | //===----------------------------------------------------------------------===// |
13 | | |
14 | | /* Capstone Disassembly Engine */ |
15 | | /* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2019 */ |
16 | | |
17 | | #ifdef CAPSTONE_HAS_ARM64 |
18 | | |
19 | | #if defined (WIN32) || defined (WIN64) || defined (_WIN32) || defined (_WIN64) |
20 | | #pragma warning(disable:4996) // disable MSVC's warning on strcpy() |
21 | | #pragma warning(disable:28719) // disable MSVC's warning on strcpy() |
22 | | #endif |
23 | | |
24 | | #include "../../utils.h" |
25 | | |
26 | | #include <stdio.h> |
27 | | #include <stdlib.h> |
28 | | |
29 | | #include "AArch64BaseInfo.h" |
30 | | |
31 | | #include "AArch64GenSystemOperands.inc" |
32 | | |
33 | | // return a string representing the number X |
34 | | // NOTE: result must be big enough to contain the data |
35 | | static void utostr(uint64_t X, bool isNeg, char *result) |
36 | 27.3k | { |
37 | 27.3k | char Buffer[22]; |
38 | 27.3k | char *BufPtr = Buffer + 21; |
39 | | |
40 | 27.3k | Buffer[21] = '\0'; |
41 | 27.3k | if (X == 0) *--BufPtr = '0'; // Handle special case... |
42 | | |
43 | 52.2k | while (X) { |
44 | 24.8k | *--BufPtr = X % 10 + '0'; |
45 | 24.8k | X /= 10; |
46 | 24.8k | } |
47 | | |
48 | 27.3k | if (isNeg) *--BufPtr = '-'; // Add negative sign... |
49 | | |
50 | | // suppose that result is big enough |
51 | 27.3k | strncpy(result, BufPtr, sizeof(Buffer)); |
52 | 27.3k | } |
53 | | |
54 | | // NOTE: result must be big enough to contain the result |
55 | | void AArch64SysReg_genericRegisterString(uint32_t Bits, char *result) |
56 | 5.46k | { |
57 | | // assert(Bits < 0x10000); |
58 | 5.46k | char Op0Str[32], Op1Str[32], CRnStr[32], CRmStr[32], Op2Str[32]; |
59 | 5.46k | int dummy; |
60 | 5.46k | uint32_t Op0 = (Bits >> 14) & 0x3; |
61 | 5.46k | uint32_t Op1 = (Bits >> 11) & 0x7; |
62 | 5.46k | uint32_t CRn = (Bits >> 7) & 0xf; |
63 | 5.46k | uint32_t CRm = (Bits >> 3) & 0xf; |
64 | 5.46k | uint32_t Op2 = Bits & 0x7; |
65 | | |
66 | 5.46k | utostr(Op0, false, Op0Str); |
67 | 5.46k | utostr(Op1, false, Op1Str); |
68 | 5.46k | utostr(Op2, false, Op2Str); |
69 | 5.46k | utostr(CRn, false, CRnStr); |
70 | 5.46k | utostr(CRm, false, CRmStr); |
71 | | |
72 | 5.46k | dummy = cs_snprintf(result, 128, "s%s_%s_c%s_c%s_%s", |
73 | 5.46k | Op0Str, Op1Str, CRnStr, CRmStr, Op2Str); |
74 | 5.46k | (void)dummy; |
75 | 5.46k | } |
76 | | |
77 | | #endif |