xref: /aosp_15_r20/external/capstone/arch/PowerPC/PPCPredicates.h (revision 9a0e4156d50a75a99ec4f1653a0e9602a5d45c18)
1*9a0e4156SSadaf Ebrahimi //===-- PPCPredicates.h - PPC Branch Predicate Information ------*- C++ -*-===//
2*9a0e4156SSadaf Ebrahimi //
3*9a0e4156SSadaf Ebrahimi //                     The LLVM Compiler Infrastructure
4*9a0e4156SSadaf Ebrahimi //
5*9a0e4156SSadaf Ebrahimi // This file is distributed under the University of Illinois Open Source
6*9a0e4156SSadaf Ebrahimi // License. See LICENSE.TXT for details.
7*9a0e4156SSadaf Ebrahimi //
8*9a0e4156SSadaf Ebrahimi //===----------------------------------------------------------------------===//
9*9a0e4156SSadaf Ebrahimi //
10*9a0e4156SSadaf Ebrahimi // This file describes the PowerPC branch predicates.
11*9a0e4156SSadaf Ebrahimi //
12*9a0e4156SSadaf Ebrahimi //===----------------------------------------------------------------------===//
13*9a0e4156SSadaf Ebrahimi 
14*9a0e4156SSadaf Ebrahimi /* Capstone Disassembly Engine */
15*9a0e4156SSadaf Ebrahimi /* By Nguyen Anh Quynh <[email protected]>, 2013-2015 */
16*9a0e4156SSadaf Ebrahimi 
17*9a0e4156SSadaf Ebrahimi #ifndef CS_POWERPC_PPCPREDICATES_H
18*9a0e4156SSadaf Ebrahimi #define CS_POWERPC_PPCPREDICATES_H
19*9a0e4156SSadaf Ebrahimi 
20*9a0e4156SSadaf Ebrahimi #include "capstone/ppc.h"
21*9a0e4156SSadaf Ebrahimi 
22*9a0e4156SSadaf Ebrahimi // NOTE: duplicate of ppc_bc in ppc.h to maitain code compatibility with LLVM
23*9a0e4156SSadaf Ebrahimi typedef enum ppc_predicate {
24*9a0e4156SSadaf Ebrahimi   PPC_PRED_LT       = (0 << 5) | 12,
25*9a0e4156SSadaf Ebrahimi   PPC_PRED_LE       = (1 << 5) |  4,
26*9a0e4156SSadaf Ebrahimi   PPC_PRED_EQ       = (2 << 5) | 12,
27*9a0e4156SSadaf Ebrahimi   PPC_PRED_GE       = (0 << 5) |  4,
28*9a0e4156SSadaf Ebrahimi   PPC_PRED_GT       = (1 << 5) | 12,
29*9a0e4156SSadaf Ebrahimi   PPC_PRED_NE       = (2 << 5) |  4,
30*9a0e4156SSadaf Ebrahimi   PPC_PRED_UN       = (3 << 5) | 12,
31*9a0e4156SSadaf Ebrahimi   PPC_PRED_NU       = (3 << 5) |  4,
32*9a0e4156SSadaf Ebrahimi   PPC_PRED_LT_MINUS = (0 << 5) | 14,
33*9a0e4156SSadaf Ebrahimi   PPC_PRED_LE_MINUS = (1 << 5) |  6,
34*9a0e4156SSadaf Ebrahimi   PPC_PRED_EQ_MINUS = (2 << 5) | 14,
35*9a0e4156SSadaf Ebrahimi   PPC_PRED_GE_MINUS = (0 << 5) |  6,
36*9a0e4156SSadaf Ebrahimi   PPC_PRED_GT_MINUS = (1 << 5) | 14,
37*9a0e4156SSadaf Ebrahimi   PPC_PRED_NE_MINUS = (2 << 5) |  6,
38*9a0e4156SSadaf Ebrahimi   PPC_PRED_UN_MINUS = (3 << 5) | 14,
39*9a0e4156SSadaf Ebrahimi   PPC_PRED_NU_MINUS = (3 << 5) |  6,
40*9a0e4156SSadaf Ebrahimi   PPC_PRED_LT_PLUS  = (0 << 5) | 15,
41*9a0e4156SSadaf Ebrahimi   PPC_PRED_LE_PLUS  = (1 << 5) |  7,
42*9a0e4156SSadaf Ebrahimi   PPC_PRED_EQ_PLUS  = (2 << 5) | 15,
43*9a0e4156SSadaf Ebrahimi   PPC_PRED_GE_PLUS  = (0 << 5) |  7,
44*9a0e4156SSadaf Ebrahimi   PPC_PRED_GT_PLUS  = (1 << 5) | 15,
45*9a0e4156SSadaf Ebrahimi   PPC_PRED_NE_PLUS  = (2 << 5) |  7,
46*9a0e4156SSadaf Ebrahimi   PPC_PRED_UN_PLUS  = (3 << 5) | 15,
47*9a0e4156SSadaf Ebrahimi   PPC_PRED_NU_PLUS  = (3 << 5) |  7,
48*9a0e4156SSadaf Ebrahimi 
49*9a0e4156SSadaf Ebrahimi   // When dealing with individual condition-register bits, we have simple set
50*9a0e4156SSadaf Ebrahimi   // and unset predicates.
51*9a0e4156SSadaf Ebrahimi   PPC_PRED_BIT_SET =   1024,
52*9a0e4156SSadaf Ebrahimi   PPC_PRED_BIT_UNSET = 1025
53*9a0e4156SSadaf Ebrahimi } ppc_predicate;
54*9a0e4156SSadaf Ebrahimi 
55*9a0e4156SSadaf Ebrahimi /// Invert the specified predicate.  != -> ==, < -> >=.
56*9a0e4156SSadaf Ebrahimi ppc_predicate InvertPredicate(ppc_predicate Opcode);
57*9a0e4156SSadaf Ebrahimi 
58*9a0e4156SSadaf Ebrahimi /// Assume the condition register is set by MI(a,b), return the predicate if
59*9a0e4156SSadaf Ebrahimi /// we modify the instructions such that condition register is set by MI(b,a).
60*9a0e4156SSadaf Ebrahimi ppc_predicate getSwappedPredicate(ppc_predicate Opcode);
61*9a0e4156SSadaf Ebrahimi 
62*9a0e4156SSadaf Ebrahimi #endif
63