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, tcg_env, offsetof(CPUPPCState, vsr[reg].u64[0]));
10 #define TRANS_DFP_T_A_B_Rc(NAME) \
11 static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \
13 TCGv_ptr rt, ra, rb; \
14 REQUIRE_INSNS_FLAGS2(ctx, DFP); \
16 rt = gen_fprp_ptr(a->rt); \
17 ra = gen_fprp_ptr(a->ra); \
18 rb = gen_fprp_ptr(a->rb); \
19 gen_helper_##NAME(tcg_env, rt, ra, rb); \
20 if (unlikely(a->rc)) { \
21 gen_set_cr1_from_fpscr(ctx); \
26 #define TRANS_DFP_BF_A_B(NAME) \
27 static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \
30 REQUIRE_INSNS_FLAGS2(ctx, DFP); \
32 ra = gen_fprp_ptr(a->ra); \
33 rb = gen_fprp_ptr(a->rb); \
34 gen_helper_##NAME(cpu_crf[a->bf], \
39 #define TRANS_DFP_BF_I_B(NAME) \
40 static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \
43 REQUIRE_INSNS_FLAGS2(ctx, DFP); \
45 rb = gen_fprp_ptr(a->rb); \
46 gen_helper_##NAME(cpu_crf[a->bf], \
47 tcg_env, tcg_constant_i32(a->uim), rb);\
51 #define TRANS_DFP_BF_A_DCM(NAME) \
52 static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \
55 REQUIRE_INSNS_FLAGS2(ctx, DFP); \
57 ra = gen_fprp_ptr(a->fra); \
58 gen_helper_##NAME(cpu_crf[a->bf], \
59 tcg_env, ra, tcg_constant_i32(a->dm)); \
63 #define TRANS_DFP_T_B_U32_U32_Rc(NAME, U32F1, U32F2) \
64 static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \
67 REQUIRE_INSNS_FLAGS2(ctx, DFP); \
69 rt = gen_fprp_ptr(a->frt); \
70 rb = gen_fprp_ptr(a->frb); \
71 gen_helper_##NAME(tcg_env, rt, rb, \
72 tcg_constant_i32(a->U32F1), \
73 tcg_constant_i32(a->U32F2)); \
74 if (unlikely(a->rc)) { \
75 gen_set_cr1_from_fpscr(ctx); \
80 #define TRANS_DFP_T_A_B_I32_Rc(NAME, I32FLD) \
81 static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \
83 TCGv_ptr rt, ra, rb; \
84 REQUIRE_INSNS_FLAGS2(ctx, DFP); \
86 rt = gen_fprp_ptr(a->frt); \
87 ra = gen_fprp_ptr(a->fra); \
88 rb = gen_fprp_ptr(a->frb); \
89 gen_helper_##NAME(tcg_env, rt, ra, rb, \
90 tcg_constant_i32(a->I32FLD)); \
91 if (unlikely(a->rc)) { \
92 gen_set_cr1_from_fpscr(ctx); \
97 #define TRANS_DFP_T_B_Rc(NAME) \
98 static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \
101 REQUIRE_INSNS_FLAGS2(ctx, DFP); \
103 rt = gen_fprp_ptr(a->rt); \
104 rb = gen_fprp_ptr(a->rb); \
105 gen_helper_##NAME(tcg_env, rt, rb); \
106 if (unlikely(a->rc)) { \
107 gen_set_cr1_from_fpscr(ctx); \
112 #define TRANS_DFP_T_FPR_I32_Rc(NAME, FPRFLD, I32FLD) \
113 static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \
116 REQUIRE_INSNS_FLAGS2(ctx, DFP); \
118 rt = gen_fprp_ptr(a->rt); \
119 rx = gen_fprp_ptr(a->FPRFLD); \
120 gen_helper_##NAME(tcg_env, rt, rx, \
121 tcg_constant_i32(a->I32FLD)); \
122 if (unlikely(a->rc)) { \
123 gen_set_cr1_from_fpscr(ctx); \
128 TRANS_DFP_T_A_B_Rc(DADD)
129 TRANS_DFP_T_A_B_Rc(DADDQ)
130 TRANS_DFP_T_A_B_Rc(DSUB)
131 TRANS_DFP_T_A_B_Rc(DSUBQ)
132 TRANS_DFP_T_A_B_Rc(DMUL)
133 TRANS_DFP_T_A_B_Rc(DMULQ)
134 TRANS_DFP_T_A_B_Rc(DDIV)
135 TRANS_DFP_T_A_B_Rc(DDIVQ)
136 TRANS_DFP_BF_A_B(DCMPU)
137 TRANS_DFP_BF_A_B(DCMPUQ)
138 TRANS_DFP_BF_A_B(DCMPO)
139 TRANS_DFP_BF_A_B(DCMPOQ)
140 TRANS_DFP_BF_A_DCM(DTSTDC)
141 TRANS_DFP_BF_A_DCM(DTSTDCQ)
142 TRANS_DFP_BF_A_DCM(DTSTDG)
143 TRANS_DFP_BF_A_DCM(DTSTDGQ)
144 TRANS_DFP_BF_A_B(DTSTEX)
145 TRANS_DFP_BF_A_B(DTSTEXQ)
146 TRANS_DFP_BF_A_B(DTSTSF)
147 TRANS_DFP_BF_A_B(DTSTSFQ)
148 TRANS_DFP_BF_I_B(DTSTSFI)
149 TRANS_DFP_BF_I_B(DTSTSFIQ)
150 TRANS_DFP_T_B_U32_U32_Rc(DQUAI, te, rmc)
151 TRANS_DFP_T_B_U32_U32_Rc(DQUAIQ, te, rmc)
152 TRANS_DFP_T_A_B_I32_Rc(DQUA, rmc)
153 TRANS_DFP_T_A_B_I32_Rc(DQUAQ, rmc)
154 TRANS_DFP_T_A_B_I32_Rc(DRRND, rmc)
155 TRANS_DFP_T_A_B_I32_Rc(DRRNDQ, rmc)
156 TRANS_DFP_T_B_U32_U32_Rc(DRINTX, r, rmc)
157 TRANS_DFP_T_B_U32_U32_Rc(DRINTXQ, r, rmc)
158 TRANS_DFP_T_B_U32_U32_Rc(DRINTN, r, rmc)
159 TRANS_DFP_T_B_U32_U32_Rc(DRINTNQ, r, rmc)
160 TRANS_DFP_T_B_Rc(DCTDP)
161 TRANS_DFP_T_B_Rc(DCTQPQ)
162 TRANS_DFP_T_B_Rc(DRSP)
163 TRANS_DFP_T_B_Rc(DRDPQ)
164 TRANS_DFP_T_B_Rc(DCFFIX)
165 TRANS_DFP_T_B_Rc(DCFFIXQ)
166 TRANS_DFP_T_B_Rc(DCTFIX)
167 TRANS_DFP_T_B_Rc(DCTFIXQ)
168 TRANS_DFP_T_FPR_I32_Rc(DDEDPD, rb, sp)
169 TRANS_DFP_T_FPR_I32_Rc(DDEDPDQ, rb, sp)
170 TRANS_DFP_T_FPR_I32_Rc(DENBCD, rb, s)
171 TRANS_DFP_T_FPR_I32_Rc(DENBCDQ, rb, s)
172 TRANS_DFP_T_B_Rc(DXEX)
173 TRANS_DFP_T_B_Rc(DXEXQ)
174 TRANS_DFP_T_A_B_Rc(DIEX)
175 TRANS_DFP_T_A_B_Rc(DIEXQ)
176 TRANS_DFP_T_FPR_I32_Rc(DSCLI, ra, sh)
177 TRANS_DFP_T_FPR_I32_Rc(DSCLIQ, ra, sh)
178 TRANS_DFP_T_FPR_I32_Rc(DSCRI, ra, sh)
179 TRANS_DFP_T_FPR_I32_Rc(DSCRIQ, ra, sh)
181 static bool trans_DCFFIXQQ(DisasContext *ctx, arg_DCFFIXQQ *a)
185 REQUIRE_INSNS_FLAGS2(ctx, DFP);
189 rt = gen_fprp_ptr(a->frtp);
190 rb = gen_avr_ptr(a->vrb);
191 gen_helper_DCFFIXQQ(tcg_env, rt, rb);
196 static bool trans_DCTFIXQQ(DisasContext *ctx, arg_DCTFIXQQ *a)
200 REQUIRE_INSNS_FLAGS2(ctx, DFP);
204 rt = gen_avr_ptr(a->vrt);
205 rb = gen_fprp_ptr(a->frbp);
206 gen_helper_DCTFIXQQ(tcg_env, rt, rb);