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->base.pc_next - 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->base.pc_next - 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->base.pc_next - 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->base.pc_next - 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->base.pc_next - 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->base.pc_next - 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->base.pc_next - 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->base.pc_next - 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