1
/*** Decimal Floating Point ***/
3
static inline TCGv_ptr gen_fprp_ptr(int reg)
5
TCGv_ptr r = tcg_temp_new_ptr();
6
tcg_gen_addi_ptr(r, cpu_env, offsetof(CPUPPCState, fpr[reg]));
10
#define GEN_DFP_T_A_B_Rc(name) \
11
static void gen_##name(DisasContext *ctx) \
13
TCGv_ptr rd, ra, rb; \
14
if (unlikely(!ctx->fpu_enabled)) { \
15
gen_exception(ctx, POWERPC_EXCP_FPU); \
18
gen_update_nip(ctx, ctx->nip - 4); \
19
rd = gen_fprp_ptr(rD(ctx->opcode)); \
20
ra = gen_fprp_ptr(rA(ctx->opcode)); \
21
rb = gen_fprp_ptr(rB(ctx->opcode)); \
22
gen_helper_##name(cpu_env, rd, ra, rb); \
23
if (unlikely(Rc(ctx->opcode) != 0)) { \
24
gen_set_cr1_from_fpscr(ctx); \
26
tcg_temp_free_ptr(rd); \
27
tcg_temp_free_ptr(ra); \
28
tcg_temp_free_ptr(rb); \
31
#define GEN_DFP_BF_A_B(name) \
32
static void gen_##name(DisasContext *ctx) \
35
if (unlikely(!ctx->fpu_enabled)) { \
36
gen_exception(ctx, POWERPC_EXCP_FPU); \
39
gen_update_nip(ctx, ctx->nip - 4); \
40
ra = gen_fprp_ptr(rA(ctx->opcode)); \
41
rb = gen_fprp_ptr(rB(ctx->opcode)); \
42
gen_helper_##name(cpu_crf[crfD(ctx->opcode)], \
44
tcg_temp_free_ptr(ra); \
45
tcg_temp_free_ptr(rb); \
48
#define GEN_DFP_BF_I_B(name) \
49
static void gen_##name(DisasContext *ctx) \
53
if (unlikely(!ctx->fpu_enabled)) { \
54
gen_exception(ctx, POWERPC_EXCP_FPU); \
57
gen_update_nip(ctx, ctx->nip - 4); \
58
uim = tcg_const_i32(UIMM5(ctx->opcode)); \
59
rb = gen_fprp_ptr(rB(ctx->opcode)); \
60
gen_helper_##name(cpu_crf[crfD(ctx->opcode)], \
62
tcg_temp_free_i32(uim); \
63
tcg_temp_free_ptr(rb); \
66
#define GEN_DFP_BF_A_DCM(name) \
67
static void gen_##name(DisasContext *ctx) \
71
if (unlikely(!ctx->fpu_enabled)) { \
72
gen_exception(ctx, POWERPC_EXCP_FPU); \
75
gen_update_nip(ctx, ctx->nip - 4); \
76
ra = gen_fprp_ptr(rA(ctx->opcode)); \
77
dcm = tcg_const_i32(DCM(ctx->opcode)); \
78
gen_helper_##name(cpu_crf[crfD(ctx->opcode)], \
80
tcg_temp_free_ptr(ra); \
81
tcg_temp_free_i32(dcm); \
84
#define GEN_DFP_T_B_U32_U32_Rc(name, u32f1, u32f2) \
85
static void gen_##name(DisasContext *ctx) \
88
TCGv_i32 u32_1, u32_2; \
89
if (unlikely(!ctx->fpu_enabled)) { \
90
gen_exception(ctx, POWERPC_EXCP_FPU); \
93
gen_update_nip(ctx, ctx->nip - 4); \
94
rt = gen_fprp_ptr(rD(ctx->opcode)); \
95
rb = gen_fprp_ptr(rB(ctx->opcode)); \
96
u32_1 = tcg_const_i32(u32f1(ctx->opcode)); \
97
u32_2 = tcg_const_i32(u32f2(ctx->opcode)); \
98
gen_helper_##name(cpu_env, rt, rb, u32_1, u32_2); \
99
if (unlikely(Rc(ctx->opcode) != 0)) { \
100
gen_set_cr1_from_fpscr(ctx); \
102
tcg_temp_free_ptr(rt); \
103
tcg_temp_free_ptr(rb); \
104
tcg_temp_free_i32(u32_1); \
105
tcg_temp_free_i32(u32_2); \
108
#define GEN_DFP_T_A_B_I32_Rc(name, i32fld) \
109
static void gen_##name(DisasContext *ctx) \
111
TCGv_ptr rt, ra, rb; \
113
if (unlikely(!ctx->fpu_enabled)) { \
114
gen_exception(ctx, POWERPC_EXCP_FPU); \
117
gen_update_nip(ctx, ctx->nip - 4); \
118
rt = gen_fprp_ptr(rD(ctx->opcode)); \
119
ra = gen_fprp_ptr(rA(ctx->opcode)); \
120
rb = gen_fprp_ptr(rB(ctx->opcode)); \
121
i32 = tcg_const_i32(i32fld(ctx->opcode)); \
122
gen_helper_##name(cpu_env, rt, ra, rb, i32); \
123
if (unlikely(Rc(ctx->opcode) != 0)) { \
124
gen_set_cr1_from_fpscr(ctx); \
126
tcg_temp_free_ptr(rt); \
127
tcg_temp_free_ptr(rb); \
128
tcg_temp_free_ptr(ra); \
129
tcg_temp_free_i32(i32); \
132
#define GEN_DFP_T_B_Rc(name) \
133
static void gen_##name(DisasContext *ctx) \
136
if (unlikely(!ctx->fpu_enabled)) { \
137
gen_exception(ctx, POWERPC_EXCP_FPU); \
140
gen_update_nip(ctx, ctx->nip - 4); \
141
rt = gen_fprp_ptr(rD(ctx->opcode)); \
142
rb = gen_fprp_ptr(rB(ctx->opcode)); \
143
gen_helper_##name(cpu_env, rt, rb); \
144
if (unlikely(Rc(ctx->opcode) != 0)) { \
145
gen_set_cr1_from_fpscr(ctx); \
147
tcg_temp_free_ptr(rt); \
148
tcg_temp_free_ptr(rb); \
151
#define GEN_DFP_T_FPR_I32_Rc(name, fprfld, i32fld) \
152
static void gen_##name(DisasContext *ctx) \
156
if (unlikely(!ctx->fpu_enabled)) { \
157
gen_exception(ctx, POWERPC_EXCP_FPU); \
160
gen_update_nip(ctx, ctx->nip - 4); \
161
rt = gen_fprp_ptr(rD(ctx->opcode)); \
162
rs = gen_fprp_ptr(fprfld(ctx->opcode)); \
163
i32 = tcg_const_i32(i32fld(ctx->opcode)); \
164
gen_helper_##name(cpu_env, rt, rs, i32); \
165
if (unlikely(Rc(ctx->opcode) != 0)) { \
166
gen_set_cr1_from_fpscr(ctx); \
168
tcg_temp_free_ptr(rt); \
169
tcg_temp_free_ptr(rs); \
170
tcg_temp_free_i32(i32); \
173
GEN_DFP_T_A_B_Rc(dadd)
174
GEN_DFP_T_A_B_Rc(daddq)
175
GEN_DFP_T_A_B_Rc(dsub)
176
GEN_DFP_T_A_B_Rc(dsubq)
177
GEN_DFP_T_A_B_Rc(dmul)
178
GEN_DFP_T_A_B_Rc(dmulq)
179
GEN_DFP_T_A_B_Rc(ddiv)
180
GEN_DFP_T_A_B_Rc(ddivq)
181
GEN_DFP_BF_A_B(dcmpu)
182
GEN_DFP_BF_A_B(dcmpuq)
183
GEN_DFP_BF_A_B(dcmpo)
184
GEN_DFP_BF_A_B(dcmpoq)
185
GEN_DFP_BF_A_DCM(dtstdc)
186
GEN_DFP_BF_A_DCM(dtstdcq)
187
GEN_DFP_BF_A_DCM(dtstdg)
188
GEN_DFP_BF_A_DCM(dtstdgq)
189
GEN_DFP_BF_A_B(dtstex)
190
GEN_DFP_BF_A_B(dtstexq)
191
GEN_DFP_BF_A_B(dtstsf)
192
GEN_DFP_BF_A_B(dtstsfq)
193
GEN_DFP_BF_I_B(dtstsfi)
194
GEN_DFP_BF_I_B(dtstsfiq)
195
GEN_DFP_T_B_U32_U32_Rc(dquai, SIMM5, RMC)
196
GEN_DFP_T_B_U32_U32_Rc(dquaiq, SIMM5, RMC)
197
GEN_DFP_T_A_B_I32_Rc(dqua, RMC)
198
GEN_DFP_T_A_B_I32_Rc(dquaq, RMC)
199
GEN_DFP_T_A_B_I32_Rc(drrnd, RMC)
200
GEN_DFP_T_A_B_I32_Rc(drrndq, RMC)
201
GEN_DFP_T_B_U32_U32_Rc(drintx, FPW, RMC)
202
GEN_DFP_T_B_U32_U32_Rc(drintxq, FPW, RMC)
203
GEN_DFP_T_B_U32_U32_Rc(drintn, FPW, RMC)
204
GEN_DFP_T_B_U32_U32_Rc(drintnq, FPW, RMC)
205
GEN_DFP_T_B_Rc(dctdp)
206
GEN_DFP_T_B_Rc(dctqpq)
208
GEN_DFP_T_B_Rc(drdpq)
209
GEN_DFP_T_B_Rc(dcffix)
210
GEN_DFP_T_B_Rc(dcffixq)
211
GEN_DFP_T_B_Rc(dctfix)
212
GEN_DFP_T_B_Rc(dctfixq)
213
GEN_DFP_T_FPR_I32_Rc(ddedpd, rB, SP)
214
GEN_DFP_T_FPR_I32_Rc(ddedpdq, rB, SP)
215
GEN_DFP_T_FPR_I32_Rc(denbcd, rB, SP)
216
GEN_DFP_T_FPR_I32_Rc(denbcdq, rB, SP)
218
GEN_DFP_T_B_Rc(dxexq)
219
GEN_DFP_T_A_B_Rc(diex)
220
GEN_DFP_T_A_B_Rc(diexq)
221
GEN_DFP_T_FPR_I32_Rc(dscli, rA, DCM)
222
GEN_DFP_T_FPR_I32_Rc(dscliq, rA, DCM)
223
GEN_DFP_T_FPR_I32_Rc(dscri, rA, DCM)
224
GEN_DFP_T_FPR_I32_Rc(dscriq, rA, DCM)
226
#undef GEN_DFP_T_A_B_Rc
227
#undef GEN_DFP_BF_A_B
228
#undef GEN_DFP_BF_A_DCM
229
#undef GEN_DFP_T_B_U32_U32_Rc
230
#undef GEN_DFP_T_A_B_I32_Rc
231
#undef GEN_DFP_T_B_Rc
232
#undef GEN_DFP_T_FPR_I32_Rc