Coverage Report

Created: 2023-12-08 06:05

/src/capstonenext/arch/Sparc/SparcMapping.c
Line
Count
Source (jump to first uncovered line)
1
/* Capstone Disassembly Engine */
2
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2015 */
3
4
#ifdef CAPSTONE_HAS_SPARC
5
6
#include <stdio.h>  // debug
7
#include <string.h>
8
9
#include "../../Mapping.h"
10
#include "../../utils.h"
11
12
#include "SparcMapping.h"
13
14
#define GET_INSTRINFO_ENUM
15
#include "SparcGenInstrInfo.inc"
16
17
#ifndef CAPSTONE_DIET
18
static const name_map reg_name_maps[] = {
19
  { SPARC_REG_INVALID, NULL },
20
21
  { SPARC_REG_F0, "f0"},
22
  { SPARC_REG_F1, "f1"},
23
  { SPARC_REG_F2, "f2"},
24
  { SPARC_REG_F3, "f3"},
25
  { SPARC_REG_F4, "f4"},
26
  { SPARC_REG_F5, "f5"},
27
  { SPARC_REG_F6, "f6"},
28
  { SPARC_REG_F7, "f7"},
29
  { SPARC_REG_F8, "f8"},
30
  { SPARC_REG_F9, "f9"},
31
  { SPARC_REG_F10, "f10"},
32
  { SPARC_REG_F11, "f11"},
33
  { SPARC_REG_F12, "f12"},
34
  { SPARC_REG_F13, "f13"},
35
  { SPARC_REG_F14, "f14"},
36
  { SPARC_REG_F15, "f15"},
37
  { SPARC_REG_F16, "f16"},
38
  { SPARC_REG_F17, "f17"},
39
  { SPARC_REG_F18, "f18"},
40
  { SPARC_REG_F19, "f19"},
41
  { SPARC_REG_F20, "f20"},
42
  { SPARC_REG_F21, "f21"},
43
  { SPARC_REG_F22, "f22"},
44
  { SPARC_REG_F23, "f23"},
45
  { SPARC_REG_F24, "f24"},
46
  { SPARC_REG_F25, "f25"},
47
  { SPARC_REG_F26, "f26"},
48
  { SPARC_REG_F27, "f27"},
49
  { SPARC_REG_F28, "f28"},
50
  { SPARC_REG_F29, "f29"},
51
  { SPARC_REG_F30, "f30"},
52
  { SPARC_REG_F31, "f31"},
53
  { SPARC_REG_F32, "f32"},
54
  { SPARC_REG_F34, "f34"},
55
  { SPARC_REG_F36, "f36"},
56
  { SPARC_REG_F38, "f38"},
57
  { SPARC_REG_F40, "f40"},
58
  { SPARC_REG_F42, "f42"},
59
  { SPARC_REG_F44, "f44"},
60
  { SPARC_REG_F46, "f46"},
61
  { SPARC_REG_F48, "f48"},
62
  { SPARC_REG_F50, "f50"},
63
  { SPARC_REG_F52, "f52"},
64
  { SPARC_REG_F54, "f54"},
65
  { SPARC_REG_F56, "f56"},
66
  { SPARC_REG_F58, "f58"},
67
  { SPARC_REG_F60, "f60"},
68
  { SPARC_REG_F62, "f62"},
69
  { SPARC_REG_FCC0, "fcc0"},
70
  { SPARC_REG_FCC1, "fcc1"},
71
  { SPARC_REG_FCC2, "fcc2"},
72
  { SPARC_REG_FCC3, "fcc3"},
73
  { SPARC_REG_FP, "fp"},
74
  { SPARC_REG_G0, "g0"},
75
  { SPARC_REG_G1, "g1"},
76
  { SPARC_REG_G2, "g2"},
77
  { SPARC_REG_G3, "g3"},
78
  { SPARC_REG_G4, "g4"},
79
  { SPARC_REG_G5, "g5"},
80
  { SPARC_REG_G6, "g6"},
81
  { SPARC_REG_G7, "g7"},
82
  { SPARC_REG_I0, "i0"},
83
  { SPARC_REG_I1, "i1"},
84
  { SPARC_REG_I2, "i2"},
85
  { SPARC_REG_I3, "i3"},
86
  { SPARC_REG_I4, "i4"},
87
  { SPARC_REG_I5, "i5"},
88
  { SPARC_REG_I7, "i7"},
89
  { SPARC_REG_ICC, "icc"},
90
  { SPARC_REG_L0, "l0"},
91
  { SPARC_REG_L1, "l1"},
92
  { SPARC_REG_L2, "l2"},
93
  { SPARC_REG_L3, "l3"},
94
  { SPARC_REG_L4, "l4"},
95
  { SPARC_REG_L5, "l5"},
96
  { SPARC_REG_L6, "l6"},
97
  { SPARC_REG_L7, "l7"},
98
  { SPARC_REG_O0, "o0"},
99
  { SPARC_REG_O1, "o1"},
100
  { SPARC_REG_O2, "o2"},
101
  { SPARC_REG_O3, "o3"},
102
  { SPARC_REG_O4, "o4"},
103
  { SPARC_REG_O5, "o5"},
104
  { SPARC_REG_O7, "o7"},
105
  { SPARC_REG_SP, "sp"},
106
  { SPARC_REG_Y, "y"},
107
108
  // special registers
109
  { SPARC_REG_XCC, "xcc"},
110
};
111
#endif
112
113
const char *Sparc_reg_name(csh handle, unsigned int reg)
114
63.1k
{
115
63.1k
#ifndef CAPSTONE_DIET
116
63.1k
  if (reg >= ARR_SIZE(reg_name_maps))
117
0
    return NULL;
118
119
63.1k
  return reg_name_maps[reg].name;
120
#else
121
  return NULL;
122
#endif
123
63.1k
}
124
125
static const insn_map insns[] = {
126
  // dummy item
127
  {
128
    0, 0,
129
#ifndef CAPSTONE_DIET
130
    { 0 }, { 0 }, { 0 }, 0, 0
131
#endif
132
  },
133
134
#include "SparcMappingInsn.inc"
135
};
136
137
static struct hint_map {
138
  unsigned int id;
139
  uint8_t hints;
140
} const insn_hints[] = {
141
  { SP_BPGEZapn, SPARC_HINT_A | SPARC_HINT_PN },
142
  { SP_BPGEZapt, SPARC_HINT_A | SPARC_HINT_PT },
143
  { SP_BPGEZnapn, SPARC_HINT_PN },
144
  { SP_BPGZapn, SPARC_HINT_A | SPARC_HINT_PN },
145
  { SP_BPGZapt, SPARC_HINT_A | SPARC_HINT_PT },
146
  { SP_BPGZnapn, SPARC_HINT_PN },
147
  { SP_BPLEZapn, SPARC_HINT_A | SPARC_HINT_PN },
148
  { SP_BPLEZapt, SPARC_HINT_A | SPARC_HINT_PT },
149
  { SP_BPLEZnapn, SPARC_HINT_PN },
150
  { SP_BPLZapn, SPARC_HINT_A | SPARC_HINT_PN },
151
  { SP_BPLZapt, SPARC_HINT_A | SPARC_HINT_PT },
152
  { SP_BPLZnapn, SPARC_HINT_PN },
153
  { SP_BPNZapn, SPARC_HINT_A | SPARC_HINT_PN },
154
  { SP_BPNZapt, SPARC_HINT_A | SPARC_HINT_PT },
155
  { SP_BPNZnapn, SPARC_HINT_PN },
156
  { SP_BPZapn, SPARC_HINT_A | SPARC_HINT_PN },
157
  { SP_BPZapt, SPARC_HINT_A | SPARC_HINT_PT },
158
  { SP_BPZnapn, SPARC_HINT_PN },
159
};
160
161
// given internal insn id, return public instruction info
162
void Sparc_get_insn_id(cs_struct *h, cs_insn *insn, unsigned int id)
163
116k
{
164
116k
  unsigned short i;
165
166
116k
  i = insn_find(insns, ARR_SIZE(insns), id, &h->insn_cache);
167
116k
  if (i != 0) {
168
116k
    insn->id = insns[i].mapid;
169
170
116k
    if (h->detail_opt) {
171
116k
#ifndef CAPSTONE_DIET
172
116k
      memcpy(insn->detail->regs_read, insns[i].regs_use, sizeof(insns[i].regs_use));
173
116k
      insn->detail->regs_read_count = (uint8_t)count_positive(insns[i].regs_use);
174
175
116k
      memcpy(insn->detail->regs_write, insns[i].regs_mod, sizeof(insns[i].regs_mod));
176
116k
      insn->detail->regs_write_count = (uint8_t)count_positive(insns[i].regs_mod);
177
178
116k
      memcpy(insn->detail->groups, insns[i].groups, sizeof(insns[i].groups));
179
116k
      insn->detail->groups_count = (uint8_t)count_positive8(insns[i].groups);
180
181
116k
      if (insns[i].branch || insns[i].indirect_branch) {
182
        // this insn also belongs to JUMP group. add JUMP group
183
45.4k
        insn->detail->groups[insn->detail->groups_count] = SPARC_GRP_JUMP;
184
45.4k
        insn->detail->groups_count++;
185
45.4k
      }
186
116k
#endif
187
      // hint code
188
2.18M
      for (i = 0; i < ARR_SIZE(insn_hints); i++) {
189
2.06M
        if (id == insn_hints[i].id) {
190
2.78k
          insn->detail->sparc.hint = insn_hints[i].hints;
191
2.78k
          break;
192
2.78k
        }
193
2.06M
      }
194
116k
    }
195
116k
  }
196
116k
}
197
198
static const name_map insn_name_maps[] = {
199
  { SPARC_INS_INVALID, NULL },
200
201
  { SPARC_INS_ADDCC, "addcc" },
202
  { SPARC_INS_ADDX, "addx" },
203
  { SPARC_INS_ADDXCC, "addxcc" },
204
  { SPARC_INS_ADDXC, "addxc" },
205
  { SPARC_INS_ADDXCCC, "addxccc" },
206
  { SPARC_INS_ADD, "add" },
207
  { SPARC_INS_ALIGNADDR, "alignaddr" },
208
  { SPARC_INS_ALIGNADDRL, "alignaddrl" },
209
  { SPARC_INS_ANDCC, "andcc" },
210
  { SPARC_INS_ANDNCC, "andncc" },
211
  { SPARC_INS_ANDN, "andn" },
212
  { SPARC_INS_AND, "and" },
213
  { SPARC_INS_ARRAY16, "array16" },
214
  { SPARC_INS_ARRAY32, "array32" },
215
  { SPARC_INS_ARRAY8, "array8" },
216
  { SPARC_INS_B, "b" },
217
  { SPARC_INS_JMP, "jmp" },
218
  { SPARC_INS_BMASK, "bmask" },
219
  { SPARC_INS_FB, "fb" },
220
  { SPARC_INS_BRGEZ, "brgez" },
221
  { SPARC_INS_BRGZ, "brgz" },
222
  { SPARC_INS_BRLEZ, "brlez" },
223
  { SPARC_INS_BRLZ, "brlz" },
224
  { SPARC_INS_BRNZ, "brnz" },
225
  { SPARC_INS_BRZ, "brz" },
226
  { SPARC_INS_BSHUFFLE, "bshuffle" },
227
  { SPARC_INS_CALL, "call" },
228
  { SPARC_INS_CASX, "casx" },
229
  { SPARC_INS_CAS, "cas" },
230
  { SPARC_INS_CMASK16, "cmask16" },
231
  { SPARC_INS_CMASK32, "cmask32" },
232
  { SPARC_INS_CMASK8, "cmask8" },
233
  { SPARC_INS_CMP, "cmp" },
234
  { SPARC_INS_EDGE16, "edge16" },
235
  { SPARC_INS_EDGE16L, "edge16l" },
236
  { SPARC_INS_EDGE16LN, "edge16ln" },
237
  { SPARC_INS_EDGE16N, "edge16n" },
238
  { SPARC_INS_EDGE32, "edge32" },
239
  { SPARC_INS_EDGE32L, "edge32l" },
240
  { SPARC_INS_EDGE32LN, "edge32ln" },
241
  { SPARC_INS_EDGE32N, "edge32n" },
242
  { SPARC_INS_EDGE8, "edge8" },
243
  { SPARC_INS_EDGE8L, "edge8l" },
244
  { SPARC_INS_EDGE8LN, "edge8ln" },
245
  { SPARC_INS_EDGE8N, "edge8n" },
246
  { SPARC_INS_FABSD, "fabsd" },
247
  { SPARC_INS_FABSQ, "fabsq" },
248
  { SPARC_INS_FABSS, "fabss" },
249
  { SPARC_INS_FADDD, "faddd" },
250
  { SPARC_INS_FADDQ, "faddq" },
251
  { SPARC_INS_FADDS, "fadds" },
252
  { SPARC_INS_FALIGNDATA, "faligndata" },
253
  { SPARC_INS_FAND, "fand" },
254
  { SPARC_INS_FANDNOT1, "fandnot1" },
255
  { SPARC_INS_FANDNOT1S, "fandnot1s" },
256
  { SPARC_INS_FANDNOT2, "fandnot2" },
257
  { SPARC_INS_FANDNOT2S, "fandnot2s" },
258
  { SPARC_INS_FANDS, "fands" },
259
  { SPARC_INS_FCHKSM16, "fchksm16" },
260
  { SPARC_INS_FCMPD, "fcmpd" },
261
  { SPARC_INS_FCMPEQ16, "fcmpeq16" },
262
  { SPARC_INS_FCMPEQ32, "fcmpeq32" },
263
  { SPARC_INS_FCMPGT16, "fcmpgt16" },
264
  { SPARC_INS_FCMPGT32, "fcmpgt32" },
265
  { SPARC_INS_FCMPLE16, "fcmple16" },
266
  { SPARC_INS_FCMPLE32, "fcmple32" },
267
  { SPARC_INS_FCMPNE16, "fcmpne16" },
268
  { SPARC_INS_FCMPNE32, "fcmpne32" },
269
  { SPARC_INS_FCMPQ, "fcmpq" },
270
  { SPARC_INS_FCMPS, "fcmps" },
271
  { SPARC_INS_FDIVD, "fdivd" },
272
  { SPARC_INS_FDIVQ, "fdivq" },
273
  { SPARC_INS_FDIVS, "fdivs" },
274
  { SPARC_INS_FDMULQ, "fdmulq" },
275
  { SPARC_INS_FDTOI, "fdtoi" },
276
  { SPARC_INS_FDTOQ, "fdtoq" },
277
  { SPARC_INS_FDTOS, "fdtos" },
278
  { SPARC_INS_FDTOX, "fdtox" },
279
  { SPARC_INS_FEXPAND, "fexpand" },
280
  { SPARC_INS_FHADDD, "fhaddd" },
281
  { SPARC_INS_FHADDS, "fhadds" },
282
  { SPARC_INS_FHSUBD, "fhsubd" },
283
  { SPARC_INS_FHSUBS, "fhsubs" },
284
  { SPARC_INS_FITOD, "fitod" },
285
  { SPARC_INS_FITOQ, "fitoq" },
286
  { SPARC_INS_FITOS, "fitos" },
287
  { SPARC_INS_FLCMPD, "flcmpd" },
288
  { SPARC_INS_FLCMPS, "flcmps" },
289
  { SPARC_INS_FLUSHW, "flushw" },
290
  { SPARC_INS_FMEAN16, "fmean16" },
291
  { SPARC_INS_FMOVD, "fmovd" },
292
  { SPARC_INS_FMOVQ, "fmovq" },
293
  { SPARC_INS_FMOVRDGEZ, "fmovrdgez" },
294
  { SPARC_INS_FMOVRQGEZ, "fmovrqgez" },
295
  { SPARC_INS_FMOVRSGEZ, "fmovrsgez" },
296
  { SPARC_INS_FMOVRDGZ, "fmovrdgz" },
297
  { SPARC_INS_FMOVRQGZ, "fmovrqgz" },
298
  { SPARC_INS_FMOVRSGZ, "fmovrsgz" },
299
  { SPARC_INS_FMOVRDLEZ, "fmovrdlez" },
300
  { SPARC_INS_FMOVRQLEZ, "fmovrqlez" },
301
  { SPARC_INS_FMOVRSLEZ, "fmovrslez" },
302
  { SPARC_INS_FMOVRDLZ, "fmovrdlz" },
303
  { SPARC_INS_FMOVRQLZ, "fmovrqlz" },
304
  { SPARC_INS_FMOVRSLZ, "fmovrslz" },
305
  { SPARC_INS_FMOVRDNZ, "fmovrdnz" },
306
  { SPARC_INS_FMOVRQNZ, "fmovrqnz" },
307
  { SPARC_INS_FMOVRSNZ, "fmovrsnz" },
308
  { SPARC_INS_FMOVRDZ, "fmovrdz" },
309
  { SPARC_INS_FMOVRQZ, "fmovrqz" },
310
  { SPARC_INS_FMOVRSZ, "fmovrsz" },
311
  { SPARC_INS_FMOVS, "fmovs" },
312
  { SPARC_INS_FMUL8SUX16, "fmul8sux16" },
313
  { SPARC_INS_FMUL8ULX16, "fmul8ulx16" },
314
  { SPARC_INS_FMUL8X16, "fmul8x16" },
315
  { SPARC_INS_FMUL8X16AL, "fmul8x16al" },
316
  { SPARC_INS_FMUL8X16AU, "fmul8x16au" },
317
  { SPARC_INS_FMULD, "fmuld" },
318
  { SPARC_INS_FMULD8SUX16, "fmuld8sux16" },
319
  { SPARC_INS_FMULD8ULX16, "fmuld8ulx16" },
320
  { SPARC_INS_FMULQ, "fmulq" },
321
  { SPARC_INS_FMULS, "fmuls" },
322
  { SPARC_INS_FNADDD, "fnaddd" },
323
  { SPARC_INS_FNADDS, "fnadds" },
324
  { SPARC_INS_FNAND, "fnand" },
325
  { SPARC_INS_FNANDS, "fnands" },
326
  { SPARC_INS_FNEGD, "fnegd" },
327
  { SPARC_INS_FNEGQ, "fnegq" },
328
  { SPARC_INS_FNEGS, "fnegs" },
329
  { SPARC_INS_FNHADDD, "fnhaddd" },
330
  { SPARC_INS_FNHADDS, "fnhadds" },
331
  { SPARC_INS_FNOR, "fnor" },
332
  { SPARC_INS_FNORS, "fnors" },
333
  { SPARC_INS_FNOT1, "fnot1" },
334
  { SPARC_INS_FNOT1S, "fnot1s" },
335
  { SPARC_INS_FNOT2, "fnot2" },
336
  { SPARC_INS_FNOT2S, "fnot2s" },
337
  { SPARC_INS_FONE, "fone" },
338
  { SPARC_INS_FONES, "fones" },
339
  { SPARC_INS_FOR, "for" },
340
  { SPARC_INS_FORNOT1, "fornot1" },
341
  { SPARC_INS_FORNOT1S, "fornot1s" },
342
  { SPARC_INS_FORNOT2, "fornot2" },
343
  { SPARC_INS_FORNOT2S, "fornot2s" },
344
  { SPARC_INS_FORS, "fors" },
345
  { SPARC_INS_FPACK16, "fpack16" },
346
  { SPARC_INS_FPACK32, "fpack32" },
347
  { SPARC_INS_FPACKFIX, "fpackfix" },
348
  { SPARC_INS_FPADD16, "fpadd16" },
349
  { SPARC_INS_FPADD16S, "fpadd16s" },
350
  { SPARC_INS_FPADD32, "fpadd32" },
351
  { SPARC_INS_FPADD32S, "fpadd32s" },
352
  { SPARC_INS_FPADD64, "fpadd64" },
353
  { SPARC_INS_FPMERGE, "fpmerge" },
354
  { SPARC_INS_FPSUB16, "fpsub16" },
355
  { SPARC_INS_FPSUB16S, "fpsub16s" },
356
  { SPARC_INS_FPSUB32, "fpsub32" },
357
  { SPARC_INS_FPSUB32S, "fpsub32s" },
358
  { SPARC_INS_FQTOD, "fqtod" },
359
  { SPARC_INS_FQTOI, "fqtoi" },
360
  { SPARC_INS_FQTOS, "fqtos" },
361
  { SPARC_INS_FQTOX, "fqtox" },
362
  { SPARC_INS_FSLAS16, "fslas16" },
363
  { SPARC_INS_FSLAS32, "fslas32" },
364
  { SPARC_INS_FSLL16, "fsll16" },
365
  { SPARC_INS_FSLL32, "fsll32" },
366
  { SPARC_INS_FSMULD, "fsmuld" },
367
  { SPARC_INS_FSQRTD, "fsqrtd" },
368
  { SPARC_INS_FSQRTQ, "fsqrtq" },
369
  { SPARC_INS_FSQRTS, "fsqrts" },
370
  { SPARC_INS_FSRA16, "fsra16" },
371
  { SPARC_INS_FSRA32, "fsra32" },
372
  { SPARC_INS_FSRC1, "fsrc1" },
373
  { SPARC_INS_FSRC1S, "fsrc1s" },
374
  { SPARC_INS_FSRC2, "fsrc2" },
375
  { SPARC_INS_FSRC2S, "fsrc2s" },
376
  { SPARC_INS_FSRL16, "fsrl16" },
377
  { SPARC_INS_FSRL32, "fsrl32" },
378
  { SPARC_INS_FSTOD, "fstod" },
379
  { SPARC_INS_FSTOI, "fstoi" },
380
  { SPARC_INS_FSTOQ, "fstoq" },
381
  { SPARC_INS_FSTOX, "fstox" },
382
  { SPARC_INS_FSUBD, "fsubd" },
383
  { SPARC_INS_FSUBQ, "fsubq" },
384
  { SPARC_INS_FSUBS, "fsubs" },
385
  { SPARC_INS_FXNOR, "fxnor" },
386
  { SPARC_INS_FXNORS, "fxnors" },
387
  { SPARC_INS_FXOR, "fxor" },
388
  { SPARC_INS_FXORS, "fxors" },
389
  { SPARC_INS_FXTOD, "fxtod" },
390
  { SPARC_INS_FXTOQ, "fxtoq" },
391
  { SPARC_INS_FXTOS, "fxtos" },
392
  { SPARC_INS_FZERO, "fzero" },
393
  { SPARC_INS_FZEROS, "fzeros" },
394
  { SPARC_INS_JMPL, "jmpl" },
395
  { SPARC_INS_LDD, "ldd" },
396
  { SPARC_INS_LD, "ld" },
397
  { SPARC_INS_LDQ, "ldq" },
398
  { SPARC_INS_LDSB, "ldsb" },
399
  { SPARC_INS_LDSH, "ldsh" },
400
  { SPARC_INS_LDSW, "ldsw" },
401
  { SPARC_INS_LDUB, "ldub" },
402
  { SPARC_INS_LDUH, "lduh" },
403
  { SPARC_INS_LDX, "ldx" },
404
  { SPARC_INS_LZCNT, "lzcnt" },
405
  { SPARC_INS_MEMBAR, "membar" },
406
  { SPARC_INS_MOVDTOX, "movdtox" },
407
  { SPARC_INS_MOV, "mov" },
408
  { SPARC_INS_MOVRGEZ, "movrgez" },
409
  { SPARC_INS_MOVRGZ, "movrgz" },
410
  { SPARC_INS_MOVRLEZ, "movrlez" },
411
  { SPARC_INS_MOVRLZ, "movrlz" },
412
  { SPARC_INS_MOVRNZ, "movrnz" },
413
  { SPARC_INS_MOVRZ, "movrz" },
414
  { SPARC_INS_MOVSTOSW, "movstosw" },
415
  { SPARC_INS_MOVSTOUW, "movstouw" },
416
  { SPARC_INS_MULX, "mulx" },
417
  { SPARC_INS_NOP, "nop" },
418
  { SPARC_INS_ORCC, "orcc" },
419
  { SPARC_INS_ORNCC, "orncc" },
420
  { SPARC_INS_ORN, "orn" },
421
  { SPARC_INS_OR, "or" },
422
  { SPARC_INS_PDIST, "pdist" },
423
  { SPARC_INS_PDISTN, "pdistn" },
424
  { SPARC_INS_POPC, "popc" },
425
  { SPARC_INS_RD, "rd" },
426
  { SPARC_INS_RESTORE, "restore" },
427
  { SPARC_INS_RETT, "rett" },
428
  { SPARC_INS_SAVE, "save" },
429
  { SPARC_INS_SDIVCC, "sdivcc" },
430
  { SPARC_INS_SDIVX, "sdivx" },
431
  { SPARC_INS_SDIV, "sdiv" },
432
  { SPARC_INS_SETHI, "sethi" },
433
  { SPARC_INS_SHUTDOWN, "shutdown" },
434
  { SPARC_INS_SIAM, "siam" },
435
  { SPARC_INS_SLLX, "sllx" },
436
  { SPARC_INS_SLL, "sll" },
437
  { SPARC_INS_SMULCC, "smulcc" },
438
  { SPARC_INS_SMUL, "smul" },
439
  { SPARC_INS_SRAX, "srax" },
440
  { SPARC_INS_SRA, "sra" },
441
  { SPARC_INS_SRLX, "srlx" },
442
  { SPARC_INS_SRL, "srl" },
443
  { SPARC_INS_STBAR, "stbar" },
444
  { SPARC_INS_STB, "stb" },
445
  { SPARC_INS_STD, "std" },
446
  { SPARC_INS_ST, "st" },
447
  { SPARC_INS_STH, "sth" },
448
  { SPARC_INS_STQ, "stq" },
449
  { SPARC_INS_STX, "stx" },
450
  { SPARC_INS_SUBCC, "subcc" },
451
  { SPARC_INS_SUBX, "subx" },
452
  { SPARC_INS_SUBXCC, "subxcc" },
453
  { SPARC_INS_SUB, "sub" },
454
  { SPARC_INS_SWAP, "swap" },
455
  { SPARC_INS_TADDCCTV, "taddcctv" },
456
  { SPARC_INS_TADDCC, "taddcc" },
457
  { SPARC_INS_T, "t" },
458
  { SPARC_INS_TSUBCCTV, "tsubcctv" },
459
  { SPARC_INS_TSUBCC, "tsubcc" },
460
  { SPARC_INS_UDIVCC, "udivcc" },
461
  { SPARC_INS_UDIVX, "udivx" },
462
  { SPARC_INS_UDIV, "udiv" },
463
  { SPARC_INS_UMULCC, "umulcc" },
464
  { SPARC_INS_UMULXHI, "umulxhi" },
465
  { SPARC_INS_UMUL, "umul" },
466
  { SPARC_INS_UNIMP, "unimp" },
467
  { SPARC_INS_FCMPED, "fcmped" },
468
  { SPARC_INS_FCMPEQ, "fcmpeq" },
469
  { SPARC_INS_FCMPES, "fcmpes" },
470
  { SPARC_INS_WR, "wr" },
471
  { SPARC_INS_XMULX, "xmulx" },
472
  { SPARC_INS_XMULXHI, "xmulxhi" },
473
  { SPARC_INS_XNORCC, "xnorcc" },
474
  { SPARC_INS_XNOR, "xnor" },
475
  { SPARC_INS_XORCC, "xorcc" },
476
  { SPARC_INS_XOR, "xor" },
477
478
  // alias instructions
479
  { SPARC_INS_RET, "ret" },
480
  { SPARC_INS_RETL, "retl" },
481
};
482
483
#ifndef CAPSTONE_DIET
484
// special alias insn
485
static const name_map alias_insn_names[] = {
486
  { 0, NULL }
487
};
488
#endif
489
490
const char *Sparc_insn_name(csh handle, unsigned int id)
491
116k
{
492
116k
#ifndef CAPSTONE_DIET
493
116k
  unsigned int i;
494
495
116k
  if (id >= SPARC_INS_ENDING)
496
0
    return NULL;
497
498
  // handle special alias first
499
232k
  for (i = 0; i < ARR_SIZE(alias_insn_names); i++) {
500
116k
    if (alias_insn_names[i].id == id)
501
0
      return alias_insn_names[i].name;
502
116k
  }
503
504
116k
  return insn_name_maps[id].name;
505
#else
506
  return NULL;
507
#endif
508
116k
}
509
510
#ifndef CAPSTONE_DIET
511
static const name_map group_name_maps[] = {
512
  // generic groups
513
  { SPARC_GRP_INVALID, NULL },
514
  { SPARC_GRP_JUMP, "jump" },
515
516
  // architecture-specific groups
517
  { SPARC_GRP_HARDQUAD, "hardquad" },
518
  { SPARC_GRP_V9, "v9" },
519
  { SPARC_GRP_VIS, "vis" },
520
  { SPARC_GRP_VIS2, "vis2" },
521
  { SPARC_GRP_VIS3,  "vis3" },
522
  { SPARC_GRP_32BIT, "32bit" },
523
  { SPARC_GRP_64BIT, "64bit" },
524
};
525
#endif
526
527
const char *Sparc_group_name(csh handle, unsigned int id)
528
93.5k
{
529
93.5k
#ifndef CAPSTONE_DIET
530
93.5k
  return id2name(group_name_maps, ARR_SIZE(group_name_maps), id);
531
#else
532
  return NULL;
533
#endif
534
93.5k
}
535
536
// map internal raw register to 'public' register
537
sparc_reg Sparc_map_register(unsigned int r)
538
81.0k
{
539
81.0k
  static const unsigned int map[] = { 0,
540
81.0k
    SPARC_REG_ICC, SPARC_REG_Y, SPARC_REG_F0, SPARC_REG_F2, SPARC_REG_F4,
541
81.0k
    SPARC_REG_F6, SPARC_REG_F8, SPARC_REG_F10, SPARC_REG_F12, SPARC_REG_F14,
542
81.0k
    SPARC_REG_F16, SPARC_REG_F18, SPARC_REG_F20, SPARC_REG_F22, SPARC_REG_F24,
543
81.0k
    SPARC_REG_F26, SPARC_REG_F28, SPARC_REG_F30, SPARC_REG_F32, SPARC_REG_F34,
544
81.0k
    SPARC_REG_F36, SPARC_REG_F38, SPARC_REG_F40, SPARC_REG_F42, SPARC_REG_F44,
545
81.0k
    SPARC_REG_F46, SPARC_REG_F48, SPARC_REG_F50, SPARC_REG_F52, SPARC_REG_F54,
546
81.0k
    SPARC_REG_F56, SPARC_REG_F58, SPARC_REG_F60, SPARC_REG_F62, SPARC_REG_F0,
547
81.0k
    SPARC_REG_F1, SPARC_REG_F2, SPARC_REG_F3, SPARC_REG_F4, SPARC_REG_F5,
548
81.0k
    SPARC_REG_F6, SPARC_REG_F7, SPARC_REG_F8, SPARC_REG_F9, SPARC_REG_F10,
549
81.0k
    SPARC_REG_F11, SPARC_REG_F12, SPARC_REG_F13, SPARC_REG_F14, SPARC_REG_F15,
550
81.0k
    SPARC_REG_F16, SPARC_REG_F17, SPARC_REG_F18, SPARC_REG_F19, SPARC_REG_F20,
551
81.0k
    SPARC_REG_F21, SPARC_REG_F22, SPARC_REG_F23, SPARC_REG_F24, SPARC_REG_F25,
552
81.0k
    SPARC_REG_F26, SPARC_REG_F27, SPARC_REG_F28, SPARC_REG_F29, SPARC_REG_F30,
553
81.0k
    SPARC_REG_F31, SPARC_REG_FCC0, SPARC_REG_FCC1, SPARC_REG_FCC2, SPARC_REG_FCC3,
554
81.0k
    SPARC_REG_G0, SPARC_REG_G1, SPARC_REG_G2, SPARC_REG_G3, SPARC_REG_G4,
555
81.0k
    SPARC_REG_G5, SPARC_REG_G6, SPARC_REG_G7, SPARC_REG_I0, SPARC_REG_I1,
556
81.0k
    SPARC_REG_I2, SPARC_REG_I3, SPARC_REG_I4, SPARC_REG_I5, SPARC_REG_FP,
557
81.0k
    SPARC_REG_I7, SPARC_REG_L0, SPARC_REG_L1, SPARC_REG_L2, SPARC_REG_L3,
558
81.0k
    SPARC_REG_L4, SPARC_REG_L5, SPARC_REG_L6, SPARC_REG_L7, SPARC_REG_O0,
559
81.0k
    SPARC_REG_O1, SPARC_REG_O2, SPARC_REG_O3, SPARC_REG_O4, SPARC_REG_O5,
560
81.0k
    SPARC_REG_SP, SPARC_REG_O7, SPARC_REG_F0, SPARC_REG_F4, SPARC_REG_F8,
561
81.0k
    SPARC_REG_F12, SPARC_REG_F16, SPARC_REG_F20, SPARC_REG_F24, SPARC_REG_F28,
562
81.0k
    SPARC_REG_F32, SPARC_REG_F36, SPARC_REG_F40, SPARC_REG_F44, SPARC_REG_F48,
563
81.0k
    SPARC_REG_F52, SPARC_REG_F56, SPARC_REG_F60,
564
81.0k
  };
565
566
81.0k
  if (r < ARR_SIZE(map))
567
81.0k
    return map[r];
568
569
  // cannot find this register
570
0
  return 0;
571
81.0k
}
572
573
// map instruction name to instruction ID (public)
574
sparc_reg Sparc_map_insn(const char *name)
575
42.4k
{
576
42.4k
  unsigned int i;
577
578
  // NOTE: skip first NULL name in insn_name_maps
579
42.4k
  i = name2id(&insn_name_maps[1], ARR_SIZE(insn_name_maps) - 1, name);
580
581
42.4k
  return (i != -1)? i : SPARC_REG_INVALID;
582
42.4k
}
583
584
// NOTE: put strings in the order of string length since
585
// we are going to compare with mnemonic to find out CC
586
static const name_map alias_icc_maps[] = {
587
  { SPARC_CC_ICC_LEU, "leu" },
588
  { SPARC_CC_ICC_POS, "pos" },
589
  { SPARC_CC_ICC_NEG, "neg" },
590
  { SPARC_CC_ICC_NE, "ne" },
591
  { SPARC_CC_ICC_LE, "le" },
592
  { SPARC_CC_ICC_GE, "ge" },
593
  { SPARC_CC_ICC_GU, "gu" },
594
  { SPARC_CC_ICC_CC, "cc" },
595
  { SPARC_CC_ICC_CS, "cs" },
596
  { SPARC_CC_ICC_VC, "vc" },
597
  { SPARC_CC_ICC_VS, "vs" },
598
  { SPARC_CC_ICC_A, "a" },
599
  { SPARC_CC_ICC_N, "n" },
600
  { SPARC_CC_ICC_E, "e" },
601
  { SPARC_CC_ICC_G, "g" },
602
  { SPARC_CC_ICC_L, "l" },
603
};
604
605
static const name_map alias_fcc_maps[] = {
606
  { SPARC_CC_FCC_UGE, "uge" },
607
  { SPARC_CC_FCC_ULE, "ule" },
608
  { SPARC_CC_FCC_UG, "ug" },
609
  { SPARC_CC_FCC_UL, "ul" },
610
  { SPARC_CC_FCC_LG, "lg" },
611
  { SPARC_CC_FCC_NE, "ne" },
612
  { SPARC_CC_FCC_UE, "ue" },
613
  { SPARC_CC_FCC_GE, "ge" },
614
  { SPARC_CC_FCC_LE, "le" },
615
  { SPARC_CC_FCC_A, "a" },
616
  { SPARC_CC_FCC_N, "n" },
617
  { SPARC_CC_FCC_U, "u" },
618
  { SPARC_CC_FCC_G, "g" },
619
  { SPARC_CC_FCC_L, "l" },
620
  { SPARC_CC_FCC_E, "e" },
621
  { SPARC_CC_FCC_O, "o" },
622
};
623
624
// map CC string to CC id
625
sparc_cc Sparc_map_ICC(const char *name)
626
31.5k
{
627
31.5k
  unsigned int i;
628
629
31.5k
  i = name2id(alias_icc_maps, ARR_SIZE(alias_icc_maps), name);
630
631
31.5k
  return (i != -1)? i : SPARC_CC_INVALID;
632
31.5k
}
633
634
sparc_cc Sparc_map_FCC(const char *name)
635
9.60k
{
636
9.60k
  unsigned int i;
637
638
9.60k
  i = name2id(alias_fcc_maps, ARR_SIZE(alias_fcc_maps), name);
639
640
9.60k
  return (i != -1)? i : SPARC_CC_INVALID;
641
9.60k
}
642
643
static const name_map hint_maps[] = {
644
  { SPARC_HINT_A, ",a" },
645
  { SPARC_HINT_A | SPARC_HINT_PN, ",a,pn" },
646
  { SPARC_HINT_PN, ",pn" },
647
};
648
649
sparc_hint Sparc_map_hint(const char *name)
650
41.1k
{
651
41.1k
  size_t i, l1, l2;
652
653
41.1k
  l1 = strlen(name);
654
113k
  for(i = 0; i < ARR_SIZE(hint_maps); i++) {
655
101k
    l2 = strlen(hint_maps[i].name);
656
101k
    if (l1 > l2) {
657
      // compare the last part of @name with this hint string
658
72.7k
      if (!strcmp(hint_maps[i].name, name + (l1 - l2)))
659
29.3k
        return hint_maps[i].id;
660
72.7k
    }
661
101k
  }
662
663
11.8k
  return SPARC_HINT_INVALID;
664
41.1k
}
665
666
#endif