Coverage Report

Created: 2025-07-01 07:03

/src/capstonenext/arch/PowerPC/PPCMCTargetDesc.h
Line
Count
Source (jump to first uncovered line)
1
2
3
/* Capstone Disassembly Engine, http://www.capstone-engine.org */
4
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2022, */
5
/*    Rot127 <unisono@quyllur.org> 2022-2023 */
6
/* Automatically translated source file from LLVM. */
7
8
/* LLVM-commit: <commit> */
9
/* LLVM-tag: <tag> */
10
11
/* Only small edits allowed. */
12
/* For multiple similar edits, please create a Patch for the translator. */
13
14
/* Capstone's C++ file translator: */
15
/* https://github.com/capstone-engine/capstone/tree/next/suite/auto-sync */
16
17
//===-- PPCMCTargetDesc.h - PowerPC Target Descriptions ---------*- C++ -*-===//
18
//
19
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
20
// See https://llvm.org/LICENSE.txt for license information.
21
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
22
//
23
//===----------------------------------------------------------------------===//
24
//
25
// This file provides PowerPC specific target descriptions.
26
//
27
//===----------------------------------------------------------------------===//
28
29
#ifndef CS_PPC_MCTARGETDESC_H
30
#define CS_PPC_MCTARGETDESC_H
31
32
// GCC #defines PPC on Linux but we use it as our namespace name
33
#undef PPC
34
35
#include <capstone/platform.h>
36
#include <stdio.h>
37
#include <stdlib.h>
38
#include <string.h>
39
40
#include "../../LEB128.h"
41
#include "../../MathExtras.h"
42
#include "../../MCInst.h"
43
#include "../../MCInstrDesc.h"
44
#include "../../MCRegisterInfo.h"
45
#define CONCAT(a, b) CONCAT_(a, b)
46
#define CONCAT_(a, b) a##_##b
47
48
/// Returns true iff Val consists of one contiguous run of 1s with any number of
49
/// 0s on either side.  The 1s are allowed to wrap from LSB to MSB, so
50
/// 0x000FFF0, 0x0000FFFF, and 0xFF0000FF are all runs.  0x0F0F0000 is not,
51
/// since all 1s are not contiguous.
52
static inline bool isRunOfOnes(unsigned Val, unsigned *MB, unsigned *ME)
53
0
{
54
0
  if (!Val)
55
0
    return false;
56
0
57
0
  if (isShiftedMask_32(Val)) {
58
0
    // look for the first non-zero bit
59
0
    *MB = countLeadingZeros(Val);
60
0
    // look for the first zero bit after the run of ones
61
0
    *ME = countLeadingZeros((Val - 1) ^ Val);
62
0
    return true;
63
0
  } else {
64
0
    Val = ~Val; // invert mask
65
0
    if (isShiftedMask_32(Val)) {
66
0
      // effectively look for the first zero bit
67
0
      *ME = countLeadingZeros(Val) - 1;
68
0
      // effectively look for the first one bit after the run of zeros
69
0
      *MB = countLeadingZeros((Val - 1) ^ Val) + 1;
70
0
      return true;
71
0
    }
72
0
  }
73
0
  // no run present
74
0
  return false;
75
0
}
Unexecuted instantiation: PPCMapping.c:isRunOfOnes
Unexecuted instantiation: PPCDisassembler.c:isRunOfOnes
Unexecuted instantiation: PPCInstPrinter.c:isRunOfOnes
76
77
static inline bool isRunOfOnes64(uint64_t Val, unsigned *MB, unsigned *ME)
78
0
{
79
0
  if (!Val)
80
0
    return false;
81
0
82
0
  if (isShiftedMask_64(Val)) {
83
0
    // look for the first non-zero bit
84
0
    *MB = countLeadingZeros(Val);
85
0
    // look for the first zero bit after the run of ones
86
0
    *ME = countLeadingZeros((Val - 1) ^ Val);
87
0
    return true;
88
0
  } else {
89
0
    Val = ~Val; // invert mask
90
0
    if (isShiftedMask_64(Val)) {
91
0
      // effectively look for the first zero bit
92
0
      *ME = countLeadingZeros(Val) - 1;
93
0
      // effectively look for the first one bit after the run of zeros
94
0
      *MB = countLeadingZeros((Val - 1) ^ Val) + 1;
95
0
      return true;
96
0
    }
97
0
  }
98
0
  // no run present
99
0
  return false;
100
0
}
Unexecuted instantiation: PPCMapping.c:isRunOfOnes64
Unexecuted instantiation: PPCDisassembler.c:isRunOfOnes64
Unexecuted instantiation: PPCInstPrinter.c:isRunOfOnes64
101
102
// end namespace llvm
103
104
// Generated files will use "namespace PPC". To avoid symbol clash,
105
// undefine PPC here. PPC may be predefined on some hosts.
106
#undef PPC
107
108
// Defines symbolic names for PowerPC registers.  This defines a mapping from
109
// register name to register number.
110
//
111
#define GET_REGINFO_ENUM
112
#include "PPCGenRegisterInfo.inc"
113
114
// Defines symbolic names for the PowerPC instructions.
115
//
116
#define GET_INSTRINFO_ENUM
117
#define GET_INSTRINFO_SCHED_ENUM
118
#define GET_INSTRINFO_MC_HELPER_DECLS
119
#define GET_INSTRINFO_MC_DESC
120
#include "PPCGenInstrInfo.inc"
121
122
#define GET_SUBTARGETINFO_ENUM
123
#include "PPCGenSubtargetInfo.inc"
124
125
#define PPC_REGS0_7(X) { X##0, X##1, X##2, X##3, X##4, X##5, X##6, X##7 }
126
127
#define PPC_REGS0_31(X) \
128
  { X##0,  X##1,  X##2,  X##3,  X##4,  X##5,  X##6,  X##7, \
129
    X##8,  X##9,  X##10, X##11, X##12, X##13, X##14, X##15, \
130
    X##16, X##17, X##18, X##19, X##20, X##21, X##22, X##23, \
131
    X##24, X##25, X##26, X##27, X##28, X##29, X##30, X##31 }
132
133
#define PPC_REGS_EVEN0_30(X) \
134
  { X##0,  X##2,  X##4,  X##6,  X##8,  X##10, X##12, X##14, \
135
    X##16, X##18, X##20, X##22, X##24, X##26, X##28, X##30 }
136
137
#define PPC_REGS0_63(X) \
138
  { \
139
    X##0,  X##1,  X##2,  X##3,  X##4,  X##5,  X##6,  X##7, \
140
    X##8,  X##9,  X##10, X##11, X##12, X##13, X##14, X##15, \
141
    X##16, X##17, X##18, X##19, X##20, X##21, X##22, X##23, \
142
    X##24, X##25, X##26, X##27, X##28, X##29, X##30, X##31, \
143
    X##32, X##33, X##34, X##35, X##36, X##37, X##38, X##39, \
144
    X##40, X##41, X##42, X##43, X##44, X##45, X##46, X##47, \
145
    X##48, X##49, X##50, X##51, X##52, X##53, X##54, X##55, \
146
    X##56, X##57, X##58, X##59, X##60, X##61, X##62, X##63 \
147
  }
148
149
#define PPC_REGS_NO0_31(Z, X) \
150
  { Z,   X##1,  X##2,  X##3,  X##4,  X##5,  X##6,  X##7, \
151
    X##8,  X##9,  X##10, X##11, X##12, X##13, X##14, X##15, \
152
    X##16, X##17, X##18, X##19, X##20, X##21, X##22, X##23, \
153
    X##24, X##25, X##26, X##27, X##28, X##29, X##30, X##31 }
154
155
#define PPC_REGS_LO_HI(LO, HI) \
156
  { LO##0,  LO##1,  LO##2,  LO##3,  LO##4,  LO##5,  LO##6,  LO##7, \
157
    LO##8,  LO##9,  LO##10, LO##11, LO##12, LO##13, LO##14, LO##15, \
158
    LO##16, LO##17, LO##18, LO##19, LO##20, LO##21, LO##22, LO##23, \
159
    LO##24, LO##25, LO##26, LO##27, LO##28, LO##29, LO##30, LO##31, \
160
    HI##0,  HI##1,  HI##2,  HI##3,  HI##4,  HI##5,  HI##6,  HI##7, \
161
    HI##8,  HI##9,  HI##10, HI##11, HI##12, HI##13, HI##14, HI##15, \
162
    HI##16, HI##17, HI##18, HI##19, HI##20, HI##21, HI##22, HI##23, \
163
    HI##24, HI##25, HI##26, HI##27, HI##28, HI##29, HI##30, HI##31 }
164
165
#define PPC_REGS0_7(X) { X##0, X##1, X##2, X##3, X##4, X##5, X##6, X##7 }
166
167
#define PPC_REGS0_3(X) { X##0, X##1, X##2, X##3 }
168
169
#define DEFINE_PPC_REGCLASSES \
170
  static const MCPhysReg RRegs[32] = PPC_REGS0_31(PPC_R); \
171
  static const MCPhysReg XRegs[32] = PPC_REGS0_31(PPC_X); \
172
  static const MCPhysReg FRegs[32] = PPC_REGS0_31(PPC_F); \
173
  static const MCPhysReg FpRegs[16] = PPC_REGS_EVEN0_30(PPC_Fpair); \
174
  static const MCPhysReg VSRpRegs[32] = PPC_REGS0_31(PPC_VSRp); \
175
  static const MCPhysReg SPERegs[32] = PPC_REGS0_31(PPC_S); \
176
  static const MCPhysReg VFRegs[32] = PPC_REGS0_31(PPC_VF); \
177
  static const MCPhysReg VRegs[32] = PPC_REGS0_31(PPC_V); \
178
  static const MCPhysReg RRegsNoR0[32] = \
179
    PPC_REGS_NO0_31(PPC_ZERO, PPC_R); \
180
  static const MCPhysReg XRegsNoX0[32] = \
181
    PPC_REGS_NO0_31(PPC_ZERO8, PPC_X); \
182
  static const MCPhysReg VSRegs[64] = PPC_REGS_LO_HI(PPC_VSL, PPC_V); \
183
  static const MCPhysReg VSFRegs[64] = PPC_REGS_LO_HI(PPC_F, PPC_VF); \
184
  static const MCPhysReg VSSRegs[64] = PPC_REGS_LO_HI(PPC_F, PPC_VF); \
185
  static const MCPhysReg CRBITRegs[32] = { \
186
    PPC_CR0LT, PPC_CR0GT, PPC_CR0EQ, PPC_CR0UN, PPC_CR1LT, \
187
    PPC_CR1GT, PPC_CR1EQ, PPC_CR1UN, PPC_CR2LT, PPC_CR2GT, \
188
    PPC_CR2EQ, PPC_CR2UN, PPC_CR3LT, PPC_CR3GT, PPC_CR3EQ, \
189
    PPC_CR3UN, PPC_CR4LT, PPC_CR4GT, PPC_CR4EQ, PPC_CR4UN, \
190
    PPC_CR5LT, PPC_CR5GT, PPC_CR5EQ, PPC_CR5UN, PPC_CR6LT, \
191
    PPC_CR6GT, PPC_CR6EQ, PPC_CR6UN, PPC_CR7LT, PPC_CR7GT, \
192
    PPC_CR7EQ, PPC_CR7UN \
193
  }; \
194
  static const MCPhysReg CRRegs[8] = PPC_REGS0_7(PPC_CR); \
195
  static const MCPhysReg ACCRegs[8] = PPC_REGS0_7(PPC_ACC); \
196
  static const MCPhysReg WACCRegs[8] = PPC_REGS0_7(PPC_WACC); \
197
  static const MCPhysReg WACC_HIRegs[8] = PPC_REGS0_7(PPC_WACC_HI); \
198
  static const MCPhysReg DMRROWpRegs[32] = PPC_REGS0_31(PPC_DMRROWp); \
199
  static const MCPhysReg DMRROWRegs[64] = PPC_REGS0_63(PPC_DMRROW); \
200
  static const MCPhysReg DMRRegs[8] = PPC_REGS0_7(PPC_DMR); \
201
  static const MCPhysReg DMRpRegs[4] = PPC_REGS0_3(PPC_DMRp);
202
203
static const MCPhysReg QFRegs[] = {
204
  PPC_QF0,  PPC_QF1,  PPC_QF2,  PPC_QF3,  PPC_QF4,  PPC_QF5,  PPC_QF6,
205
  PPC_QF7,  PPC_QF8,  PPC_QF9,  PPC_QF10, PPC_QF11, PPC_QF12, PPC_QF13,
206
  PPC_QF14, PPC_QF15, PPC_QF16, PPC_QF17, PPC_QF18, PPC_QF19, PPC_QF20,
207
  PPC_QF21, PPC_QF22, PPC_QF23, PPC_QF24, PPC_QF25, PPC_QF26, PPC_QF27,
208
  PPC_QF28, PPC_QF29, PPC_QF30, PPC_QF31
209
};
210
211
#endif // CS_PPC_MCTARGETDESC_H