1 /* radare - LGPL - Copyright 2017 - wargio */
2 
3 #ifndef LIBPS_INTERNAL_H
4 #define LIBPS_INTERNAL_H
5 #include <r_types.h>
6 
7 #define TYPE_NONE 0
8 #define TYPE_REG  1
9 #define TYPE_IMM  2
10 #define TYPE_MEM  3
11 #define TYPE_CR   4
12 
13 #define OP(x) ((((ut32)(x)) & 0x3f) << 26)
14 #define OP_MASK OP(0x3f)
15 
16 #define OPS(op, xop) (OP(op) | ((((ut32)(xop)) & 0x1f) << 1))
17 #define OPSC(op, xop, rc) (OPS((op), (xop)) | ((rc) & 1))
18 #define OPS_MASK   OPSC(0x3f, 0x1f, 1)
19 #define OPS_MASK_DOT  OPSC(0x3f, 0x1f, 1)
20 
21 #define OPM(op, xop)  (OP(op) | ((((ut32)(xop)) & 0x3f) << 1))
22 #define OPMC(op, xop, rc) (OPM((op), (xop)) | ((rc) & 1))
23 #define OPM_MASK   OPMC(0x3f, 0x3f, 0)
24 
25 #define OPL(op, xop) (OP(op) | ((((ut32)(xop)) & 0x3ff) << 1))
26 #define OPLC(op, xop, rc) (OPL((op), (xop)) | ((rc) & 1))
27 #define OPL_MASK OPLC(0x3f, 0x3ff, 1)
28 #define OPL_MASK_DOT OPLC(0x3f, 0x3ff, 1)
29 
30 typedef enum {
31     NO_OPERAND,
32     OP_FA,
33     OP_FB,
34     OP_FC,
35     OP_FD,
36     OP_FS = OP_FD,
37     OP_crfD,
38     OP_WB,
39     OP_IB,
40     OP_WC,
41     OP_IC,
42     OP_RA,
43     OP_RB,
44     OP_DRA,
45     OP_DRB,
46 } ps_operand_id_t;
47 
48 typedef enum {
49     psq_lx,
50     psq_stx,
51     psq_lux,
52     psq_stux,
53     psq_l,
54     psq_lu,
55     psq_st,
56     psq_stu,
57 
58     ps_div,
59     ps_div_dot,
60     ps_sub,
61     ps_sub_dot,
62     ps_add,
63     ps_add_dot,
64     ps_sel,
65     ps_sel_dot,
66     ps_res,
67     ps_res_dot,
68     ps_mul,
69     ps_mul_dot,
70     ps_rsqrte,
71     ps_rsqrte_dot,
72     ps_msub,
73     ps_msub_dot,
74     ps_madd,
75     ps_madd_dot,
76     ps_nmsub,
77     ps_nmsub_dot,
78     ps_nmadd,
79     ps_nmadd_dot,
80     ps_neg,
81     ps_neg_dot,
82     ps_mr,
83     ps_mr_dot,
84     ps_nabs,
85     ps_nabs_dot,
86     ps_abs,
87     ps_abs_dot,
88 
89     ps_sum0,
90     ps_sum0_dot,
91     ps_sum1,
92     ps_sum1_dot,
93     ps_muls0,
94     ps_muls0_dot,
95     ps_muls1,
96     ps_muls1_dot,
97     ps_madds0,
98     ps_madds0_dot,
99     ps_madds1,
100     ps_madds1_dot,
101     ps_cmpu0,
102     ps_cmpo0,
103     ps_cmpu1,
104     ps_cmpo1,
105     ps_merge00,
106     ps_merge00_dot,
107     ps_merge01,
108     ps_merge01_dot,
109     ps_merge10,
110     ps_merge10_dot,
111     ps_merge11,
112     ps_merge11_dot,
113     ps_dcbz_l,
114 } ps_insn_type_t;
115 
116 typedef struct {
117     ps_insn_type_t insn;
118     const char* name;
119     unsigned int opcode;
120     unsigned int mask;
121     unsigned char operands[6];
122     const char* description;
123 } ps_opcode_t;
124 
125 typedef struct {
126     int bits;
127     int shift;
128 } ps_operand_t;
129 
130 #endif /* LIBPS_INTERNAL_H */
131 
132