]>
Commit | Line | Data |
---|---|---|
9fdcd34e AM |
1 | /* Gimple prediction routines. |
2 | ||
85ec4feb | 3 | Copyright (C) 2007-2018 Free Software Foundation, Inc. |
9fdcd34e AM |
4 | |
5 | This file is part of GCC. | |
6 | ||
7 | GCC is free software; you can redistribute it and/or modify it under | |
8 | the terms of the GNU General Public License as published by the Free | |
9 | Software Foundation; either version 3, or (at your option) any later | |
10 | version. | |
11 | ||
12 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
13 | WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 | for more details. | |
16 | ||
17 | You should have received a copy of the GNU General Public License | |
18 | along with GCC; see the file COPYING3. If not see | |
19 | <http://www.gnu.org/licenses/>. */ | |
20 | ||
21 | #ifndef GCC_GIMPLE_PREDICT_H | |
22 | #define GCC_GIMPLE_PREDICT_H | |
23 | ||
24 | #include "predict.h" | |
25 | ||
26 | /* Return the predictor of GIMPLE_PREDICT statement GS. */ | |
27 | ||
28 | static inline enum br_predictor | |
355fe088 | 29 | gimple_predict_predictor (gimple *gs) |
9fdcd34e AM |
30 | { |
31 | GIMPLE_CHECK (gs, GIMPLE_PREDICT); | |
32 | return (enum br_predictor) (gs->subcode & ~GF_PREDICT_TAKEN); | |
33 | } | |
34 | ||
35 | ||
36 | /* Set the predictor of GIMPLE_PREDICT statement GS to PREDICT. */ | |
37 | ||
38 | static inline void | |
355fe088 | 39 | gimple_predict_set_predictor (gimple *gs, enum br_predictor predictor) |
9fdcd34e AM |
40 | { |
41 | GIMPLE_CHECK (gs, GIMPLE_PREDICT); | |
42 | gs->subcode = (gs->subcode & GF_PREDICT_TAKEN) | |
43 | | (unsigned) predictor; | |
44 | } | |
45 | ||
46 | ||
47 | /* Return the outcome of GIMPLE_PREDICT statement GS. */ | |
48 | ||
49 | static inline enum prediction | |
355fe088 | 50 | gimple_predict_outcome (gimple *gs) |
9fdcd34e AM |
51 | { |
52 | GIMPLE_CHECK (gs, GIMPLE_PREDICT); | |
53 | return (gs->subcode & GF_PREDICT_TAKEN) ? TAKEN : NOT_TAKEN; | |
54 | } | |
55 | ||
56 | ||
57 | /* Set the outcome of GIMPLE_PREDICT statement GS to OUTCOME. */ | |
58 | ||
59 | static inline void | |
355fe088 | 60 | gimple_predict_set_outcome (gimple *gs, enum prediction outcome) |
9fdcd34e AM |
61 | { |
62 | GIMPLE_CHECK (gs, GIMPLE_PREDICT); | |
63 | if (outcome == TAKEN) | |
64 | gs->subcode |= GF_PREDICT_TAKEN; | |
65 | else | |
66 | gs->subcode &= ~GF_PREDICT_TAKEN; | |
67 | } | |
68 | ||
69 | /* Build a GIMPLE_PREDICT statement. PREDICT is one of the predictors from | |
70 | predict.def, OUTCOME is NOT_TAKEN or TAKEN. */ | |
71 | ||
355fe088 | 72 | inline gimple * |
9fdcd34e AM |
73 | gimple_build_predict (enum br_predictor predictor, enum prediction outcome) |
74 | { | |
355fe088 | 75 | gimple *p = gimple_alloc (GIMPLE_PREDICT, 0); |
9fdcd34e AM |
76 | /* Ensure all the predictors fit into the lower bits of the subcode. */ |
77 | gcc_assert ((int) END_PREDICTORS <= GF_PREDICT_TAKEN); | |
78 | gimple_predict_set_predictor (p, predictor); | |
79 | gimple_predict_set_outcome (p, outcome); | |
80 | return p; | |
81 | } | |
82 | ||
e59a1c22 ML |
83 | /* Return true if GS is a GIMPLE_PREDICT statement. */ |
84 | ||
85 | static inline bool | |
86 | is_gimple_predict (const gimple *gs) | |
87 | { | |
88 | return gimple_code (gs) == GIMPLE_PREDICT; | |
89 | } | |
90 | ||
9fdcd34e | 91 | #endif /* GCC_GIMPLE_PREDICT_H */ |