dst[1] = dfp[LO_IDX];
}
+static void set_dfp64(uint64_t *dfp, uint64_t *src)
+{
+ dfp[0] = src[0];
+}
+
+static void set_dfp128(uint64_t *dfp, uint64_t *src)
+{
+ dfp[0] = src[HI_IDX];
+ dfp[1] = src[LO_IDX];
+}
+
struct PPC_DFP {
CPUPPCState *env;
uint64_t t64[2], a64[2], b64[2];
decimal##size##FromNumber((decimal##size *)dfp.t64, &dfp.t, &dfp.context); \
postprocs(&dfp); \
if (size == 64) { \
- t[0] = dfp.t64[0]; \
+ set_dfp64(t, dfp.t64); \
} else if (size == 128) { \
- t[0] = dfp.t64[HI_IDX]; \
- t[1] = dfp.t64[LO_IDX]; \
+ set_dfp128(t, dfp.t64); \
} \
}
QUA_PPs(&dfp); \
\
if (size == 64) { \
- t[0] = dfp.t64[0]; \
+ set_dfp64(t, dfp.t64); \
} else if (size == 128) { \
- t[0] = dfp.t64[HI_IDX]; \
- t[1] = dfp.t64[LO_IDX]; \
+ set_dfp128(t, dfp.t64); \
} \
}
QUA_PPs(&dfp); \
\
if (size == 64) { \
- t[0] = dfp.t64[0]; \
+ set_dfp64(t, dfp.t64); \
} else if (size == 128) { \
- t[0] = dfp.t64[HI_IDX]; \
- t[1] = dfp.t64[LO_IDX]; \
+ set_dfp128(t, dfp.t64); \
} \
}
QUA_PPs(&dfp); \
\
if (size == 64) { \
- t[0] = dfp.t64[0]; \
+ set_dfp64(t, dfp.t64); \
} else if (size == 128) { \
- t[0] = dfp.t64[HI_IDX]; \
- t[1] = dfp.t64[LO_IDX]; \
+ set_dfp128(t, dfp.t64); \
} \
}
postprocs(&dfp); \
\
if (size == 64) { \
- t[0] = dfp.t64[0]; \
+ set_dfp64(t, dfp.t64); \
} else if (size == 128) { \
- t[0] = dfp.t64[HI_IDX]; \
- t[1] = dfp.t64[LO_IDX]; \
+ set_dfp128(t, dfp.t64); \
} \
}
dfp_prepare_decimal64(&dfp, 0, 0, env);
decimal32ToNumber((decimal32 *)&b_short, &dfp.t);
- decimal64FromNumber((decimal64 *)t, &dfp.t, &dfp.context);
+ decimal64FromNumber((decimal64 *)&dfp.t64, &dfp.t, &dfp.context);
+ set_dfp64(t, dfp.t64);
dfp_set_FPRF_from_FRT(&dfp);
}
dfp_set_FPRF_from_FRT(&dfp);
decimal128FromNumber((decimal128 *)&dfp.t64, &dfp.t, &dfp.context);
- t[0] = dfp.t64[HI_IDX];
- t[1] = dfp.t64[LO_IDX];
+ set_dfp128(t, dfp.t64);
}
void helper_drsp(CPUPPCState *env, uint64_t *t, uint64_t *b)
{
struct PPC_DFP dfp;
uint32_t t_short = 0;
+ uint64_t t64;
dfp_prepare_decimal64(&dfp, 0, b, env);
decimal32FromNumber((decimal32 *)&t_short, &dfp.b, &dfp.context);
decimal32ToNumber((decimal32 *)&t_short, &dfp.t);
dfp_check_for_UX(&dfp);
dfp_check_for_XX(&dfp);
- *t = t_short;
+ t64 = (uint64_t)t_short;
+ set_dfp64(t, &t64);
}
void helper_drdpq(CPUPPCState *env, uint64_t *t, uint64_t *b)
dfp_check_for_UX(&dfp);
dfp_check_for_XX(&dfp);
+ dfp.t64[0] = dfp.t64[1] = 0;
decimal64FromNumber((decimal64 *)dfp.t64, &dfp.t, &dfp.context);
- t[0] = dfp.t64[0];
- t[1] = 0;
+ set_dfp128(t, dfp.t64);
}
#define DFP_HELPER_CFFIX(op, size) \
CFFIX_PPs(&dfp); \
\
if (size == 64) { \
- t[0] = dfp.t64[0]; \
+ set_dfp64(t, dfp.t64); \
} else if (size == 128) { \
- t[0] = dfp.t64[HI_IDX]; \
- t[1] = dfp.t64[LO_IDX]; \
+ set_dfp128(t, dfp.t64); \
} \
}
} \
} \
\
- *t = dfp.t64[0]; \
+ set_dfp64(t, dfp.t64); \
}
DFP_HELPER_CTFIX(dctfix, 64)
} \
\
if (size == 64) { \
- t[0] = dfp.t64[0]; \
+ set_dfp64(t, dfp.t64); \
} else if (size == 128) { \
- t[0] = dfp.t64[HI_IDX]; \
- t[1] = dfp.t64[LO_IDX]; \
+ set_dfp128(t, dfp.t64); \
} \
}
&dfp.context); \
dfp_set_FPRF_from_FRT(&dfp); \
if ((size) == 64) { \
- t[0] = dfp.t64[0]; \
+ set_dfp64(t, dfp.t64); \
} else if ((size) == 128) { \
- t[0] = dfp.t64[HI_IDX]; \
- t[1] = dfp.t64[LO_IDX]; \
+ set_dfp128(t, dfp.t64); \
} \
}
void helper_##op(CPUPPCState *env, uint64_t *t, uint64_t *b) \
{ \
struct PPC_DFP dfp; \
+ uint64_t t64; \
\
dfp_prepare_decimal##size(&dfp, 0, b, env); \
\
if (unlikely(decNumberIsSpecial(&dfp.b))) { \
if (decNumberIsInfinite(&dfp.b)) { \
- *t = -1; \
+ t64 = -1; \
} else if (decNumberIsSNaN(&dfp.b)) { \
- *t = -3; \
+ t64 = -3; \
} else if (decNumberIsQNaN(&dfp.b)) { \
- *t = -2; \
+ t64 = -2; \
} else { \
assert(0); \
} \
+ set_dfp64(t, &t64); \
} else { \
if ((size) == 64) { \
- *t = dfp.b.exponent + 398; \
+ t64 = dfp.b.exponent + 398; \
} else if ((size) == 128) { \
- *t = dfp.b.exponent + 6176; \
+ t64 = dfp.b.exponent + 6176; \
} else { \
assert(0); \
} \
+ set_dfp64(t, &t64); \
} \
}
&dfp.context); \
} \
if (size == 64) { \
- t[0] = dfp.t64[0]; \
+ set_dfp64(t, dfp.t64); \
} else if (size == 128) { \
- t[0] = dfp.t64[HI_IDX]; \
- t[1] = dfp.t64[LO_IDX]; \
+ set_dfp128(t, dfp.t64); \
} \
}
} \
\
if ((size) == 64) { \
- t[0] = dfp.t64[0]; \
+ set_dfp64(t, dfp.t64); \
} else { \
- t[0] = dfp.t64[HI_IDX]; \
- t[1] = dfp.t64[LO_IDX]; \
+ set_dfp128(t, dfp.t64); \
} \
}