summaryrefslogtreecommitdiff
path: root/target-ppc/exec.h
blob: da1ebb765abfaf3039dabb45f7f9a6797358d6e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
/*
 *  PPC emulation definitions for qemu.
 * 
 *  Copyright (c) 2003 Jocelyn Mayer
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
#if !defined (__PPC_H__)
#define __PPC_H__

#include "dyngen-exec.h"

register struct CPUPPCState *env asm(AREG0);
register uint32_t T0 asm(AREG1);
register uint32_t T1 asm(AREG2);
register uint32_t T2 asm(AREG3);

#define PARAM(n) ((uint32_t)PARAM##n)
#define SPARAM(n) ((int32_t)PARAM##n)
#define FT0 (env->ft0)
#define FT1 (env->ft1)
#define FT2 (env->ft2)
#define FTS0 ((float)env->ft0)
#define FTS1 ((float)env->ft1)
#define FTS2 ((float)env->ft2)

#define RETURN() __asm__ __volatile__("");

#include "cpu.h"
#include "exec-all.h"

static inline uint8_t ld8 (uint32_t EA)
{
    return *((uint8_t *)EA);
}

static inline uint16_t ld16 (uint32_t EA)
{
    return __be16_to_cpu(*((uint16_t *)EA));
}

static inline uint16_t ld16r (uint32_t EA)
{
    return __le16_to_cpu(*((uint16_t *)EA));
}

static inline uint32_t ld32 (uint32_t EA)
{
    return __be32_to_cpu(*((uint32_t *)EA));
}

static inline uint32_t ld32r (uint32_t EA)
{
    return __le32_to_cpu(*((uint32_t *)EA));
}

static inline uint64_t ld64 (uint32_t EA)
{
    return __be64_to_cpu(*((uint64_t *)EA));
}

static inline uint64_t ld64r (uint32_t EA)
{
    return __le64_to_cpu(*((uint64_t *)EA));
}

static inline void st8 (uint32_t EA, uint8_t data)
{
    *((uint8_t *)EA) = data;
}

static inline void st16 (uint32_t EA, uint16_t data)
{
    *((uint16_t *)EA) = __cpu_to_be16(data);
}

static inline void st16r (uint32_t EA, uint16_t data)
{
    *((uint16_t *)EA) = __cpu_to_le16(data);
}

static inline void st32 (uint32_t EA, uint32_t data)
{
    *((uint32_t *)EA) = __cpu_to_be32(data);
}

static inline void st32r (uint32_t EA, uint32_t data)
{
    *((uint32_t *)EA) = __cpu_to_le32(data);
}

static inline void st64 (uint32_t EA, uint64_t data)
{
    *((uint64_t *)EA) = __cpu_to_be64(data);
}

static inline void st64r (uint32_t EA, uint64_t data)
{
    *((uint64_t *)EA) = __cpu_to_le64(data);
}

static inline void set_CRn(int n, uint8_t value)
{
    env->crf[n] = value;
}

static inline void set_carry (void)
{
    xer_ca = 1;
}

static inline void reset_carry (void)
{
    xer_ca = 0;
}

static inline void set_overflow (void)
{
    xer_so = 1;
    xer_ov = 1;
}

static inline void reset_overflow (void)
{
    xer_ov = 0;
}

static inline uint32_t rotl (uint32_t i, int n)
{
    return ((i << n) | (i >> (32 - n)));
}

void raise_exception (int exception_index);
void raise_exception_err (int exception_index, int error_code);

uint32_t do_load_cr (void);
void do_store_cr (uint32_t crn, uint32_t value);
uint32_t do_load_xer (void);
void do_store_xer (uint32_t value);
uint32_t do_load_msr (void);
void do_store_msr (uint32_t msr_value);
void do_load_fpscr (void);
void do_store_fpscr (uint32_t mask);

int32_t do_sraw(int32_t Ta, uint32_t Tb);
void do_lmw (int reg, uint32_t src);
void do_stmw (int reg, uint32_t dest);
void do_lsw (uint32_t reg, int count, uint32_t src);
void do_stsw (uint32_t reg, int count, uint32_t dest);

void do_dcbz (void);
void do_icbi (void);

#endif /* !defined (__PPC_H__) */