]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - sim/ppc/e500_expression.h
binutils testsuite: canonicalize subtest names in libctf
[thirdparty/binutils-gdb.git] / sim / ppc / e500_expression.h
CommitLineData
345d88d9
AC
1/* e500 expression macros, for PSIM, the PowerPC simulator.
2
1d506c26 3 Copyright 2003-2024 Free Software Foundation, Inc.
345d88d9
AC
4
5 Contributed by Red Hat Inc; developed under contract from Motorola.
6 Written by matthew green <mrg@redhat.com>.
7
8 This file is part of GDB.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
4744ac1b 12 the Free Software Foundation; either version 3 of the License, or
345d88d9
AC
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
4744ac1b 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
345d88d9
AC
22
23/* e500 register dance */
24#define EV_SET_REG4(sh, sl, h0, h1, h2, h3) do { \
25 (sh) = (((h0) & 0xffff) << 16) | ((h1) & 0xffff); \
26 (sl) = (((h2) & 0xffff) << 16) | ((h3) & 0xffff); \
27} while (0)
28#define EV_SET_REG4_ACC(sh, sl, h0, h1, h2, h3) do { \
29 (sh) = (((h0) & 0xffff) << 16) | ((h1) & 0xffff); \
30 (sl) = (((h2) & 0xffff) << 16) | ((h3) & 0xffff); \
95e40d77 31 ACC = ((uint64_t)(sh) << 32) | (sl & 0xffffffff); \
345d88d9
AC
32} while (0)
33
34#define EV_SET_REG2(sh, sl, dh, dl) do { \
35 (sh) = (dh) & 0xffffffff; \
36 (sl) = (dl) & 0xffffffff; \
37} while (0)
38#define EV_SET_REG2_ACC(sh, sl, dh, dl) do { \
39 (sh) = (dh) & 0xffffffff; \
40 (sl) = (dl) & 0xffffffff; \
95e40d77 41 ACC = ((uint64_t)(sh) << 32) | ((sl) & 0xffffffff); \
345d88d9
AC
42} while (0)
43
44#define EV_SET_REG1(sh, sl, d) do { \
95e40d77 45 (sh) = ((uint64_t)(d) >> 32) & 0xffffffff; \
345d88d9
AC
46 (sl) = (d) & 0xffffffff; \
47} while (0)
48#define EV_SET_REG1_ACC(sh, sl, d) do { \
95e40d77 49 (sh) = ((uint64_t)(d) >> 32) & 0xffffffff; \
345d88d9
AC
50 (sl) = (d) & 0xffffffff; \
51 ACC = (d); \
52} while (0)
53
54#define EV_SET_REG(s, d) do { \
55 (s) = (d) & 0xffffffff; \
56} while (0)
57
58/* get the low or high half word of a word */
95e40d77
MF
59#define EV_LOHALF(x) ((uint32_t)(x) & 0xffff)
60#define EV_HIHALF(x) (((uint32_t)(x) >> 16) & 0xffff)
345d88d9
AC
61
62/* partially visible accumulator accessors */
63#define EV_SET_ACC(rh, rl) \
95e40d77 64 ACC = ((uint64_t)(rh) << 32) | ((rl) & 0xffffffff)
345d88d9
AC
65
66#define EV_ACCLOW (ACC & 0xffffffff)
67#define EV_ACCHIGH ((ACC >> 32) & 0xffffffff)
68
69/* bit manipulation macros needed for e500 SPE */
70#define EV_BITREVERSE16(x) \
c2264c8f
MF
71 ((((x) & 0x0001) << 15) \
72 | (((x) & 0x0002) << 13) \
73 | (((x) & 0x0004) << 11) \
74 | (((x) & 0x0008) << 9) \
75 | (((x) & 0x0010) << 7) \
76 | (((x) & 0x0020) << 5) \
77 | (((x) & 0x0040) << 3) \
78 | (((x) & 0x0080) << 1) \
79 | (((x) & 0x0100) >> 1) \
80 | (((x) & 0x0200) >> 3) \
81 | (((x) & 0x0400) >> 5) \
82 | (((x) & 0x0800) >> 7) \
83 | (((x) & 0x1000) >> 9) \
84 | (((x) & 0x2000) >> 11) \
85 | (((x) & 0x4000) >> 13) \
86 | (((x) & 0x8000) >> 15))
345d88d9
AC
87
88/* saturation helpers */
95e40d77 89#define EV_MUL16_SSF(a,b) ((int64_t)((int32_t)(int16_t)(a) * (int32_t)(int16_t)(b)) << 1)
345d88d9 90/* this one loses the top sign bit; be careful */
95e40d77
MF
91#define EV_MUL32_SSF(a,b) (((int64_t)(int32_t)(a) * (int64_t)(int32_t)(b)) << 1)
92#define EV_SAT_P_S32(x) ((((int64_t)(x)) < -0x80000000LL) || (((int64_t)(x)) > 0x7fffffffLL))
93#define EV_SAT_P_U32(x) ((((int64_t)(x)) < -0LL) || (((int64_t)(x)) > 0xffffffffLL))
345d88d9
AC
94
95#define EV_SATURATE(flag, sat_val, val) \
96 ((flag) ? (sat_val) : (val))
97
98#define EV_SATURATE_ACC(flag, sign, negative_sat_val, positive_sat_val, val) \
99 ((flag) ? ((((sign) >> 63) & 1) ? (negative_sat_val) : (positive_sat_val)) : (val))
100
101/* SPEFSCR handling. */
102
103/* These bits must be clear. */
104#define EV_SPEFSCR_MASK (BIT(40) | BIT(41) | spefscr_mode | BIT(56))
105
106/* The Inexact and Divide by zero sticky bits are based on others. */
107#define EV_SET_SPEFSCR(bits) do { \
108 int finxs = (bits) & (spefscr_fgh|spefscr_fxh|spefscr_fg|spefscr_fx); \
109 int fdbzs = (bits) & (spefscr_fdbzh|spefscr_fdbz); \
110 SPREG(spr_spefscr) = ((bits) & ~EV_SPEFSCR_MASK) | \
111 (finxs ? spefscr_finxs : 0) | \
112 (fdbzs ? spefscr_fdbzs : 0); \
113} while (0)
114
115#define EV_SET_SPEFSCR_BITS(s) \
116 EV_SET_SPEFSCR(SPREG(spr_spefscr) | (s))
117
118#define EV_SET_SPEFSCR_OV(l,h) do { \
95e40d77 119 uint32_t _sPefScR = SPREG(spr_spefscr); \
345d88d9
AC
120 if (l) \
121 _sPefScR |= spefscr_ov | spefscr_sov; \
122 else \
123 _sPefScR &= ~spefscr_ov; \
124 if (h) \
125 _sPefScR |= spefscr_ovh | spefscr_sovh; \
126 else \
127 _sPefScR &= ~spefscr_ovh; \
128 EV_SET_SPEFSCR(_sPefScR); \
129} while (0)
130
131/* SPE floating point helpers. */
132
133#define EV_PMAX 0x7f7fffff
134#define EV_NMAX 0xff7fffff
135#define EV_PMIN 0x00800001
136#define EV_NMIN 0x80800001
137
138#define EV_IS_INFDENORMNAN(x) \
139 (sim_fpu_is_infinity(x) || sim_fpu_is_denorm(x) || sim_fpu_is_nan(x))
140
141/* These aren't used (yet?) For now, SPU is always enabled.
142 Would be nice if they were generated by igen for e500. */
143#define SPU_BEGIN \
144{ \
145 if (MSR & msr_e500_spu_enable) { \
146
147#define SPU_END \
148 } else { \
149 /* FIXME: raise SPU unavailable. */ \
150 } \
151}
152
153/* These are also not yet used. */
154#define SPU_FP_BEGIN \
155{
156
157#define SPU_FP_END \
158 { \
159 unsigned s = SPEFSCR; \
160 /* Check SPEFSCR; raise exceptions if any required. */ \
161 if (((spefscr_finxe || spefscr_finve) \
162 && (s & (spefscr_finvh|spefscr_finv))) \
163 || ((spefscr_finxe || spefscr_fdbze) \
164 && (s & (spefscr_fdbzh|spefscr_fdbz))) \
165 || ((spefscr_finxe || spefscr_funfe) \
166 && (s & (spefscr_funfh|spefscr_funf))) \
167 || ((spefscr_finxe || spefscr_fovfe) \
168 && (s & (spefscr_fovfh|spefscr_fovf)))) \
169 /* FIXME: raise exceptions. */; \
170 } \
171}