mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-19 08:02:15 -06:00
target/ppc: implement cdtbcd
Implements the Convert Declets To Binary Coded Decimal instruction. Since libdecnumber doesn't expose the methods for direct conversion (decDigitsFromDPD, DPD2BCD, etc), a positive decimal32 with zero exponent is used as an intermediate value to convert the declets. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Matheus Ferst <matheus.ferst@eldorado.org.br> Signed-off-by: Víctor Colombo <victor.colombo@eldorado.org.br> Message-Id: <20220629162904.105060-12-victor.colombo@eldorado.org.br> Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
This commit is contained in:
parent
38d3690bda
commit
6b924d4afc
4 changed files with 35 additions and 0 deletions
|
@ -1392,6 +1392,32 @@ DFP_HELPER_SHIFT(DSCLIQ, 128, 1)
|
||||||
DFP_HELPER_SHIFT(DSCRI, 64, 0)
|
DFP_HELPER_SHIFT(DSCRI, 64, 0)
|
||||||
DFP_HELPER_SHIFT(DSCRIQ, 128, 0)
|
DFP_HELPER_SHIFT(DSCRIQ, 128, 0)
|
||||||
|
|
||||||
|
target_ulong helper_CDTBCD(target_ulong s)
|
||||||
|
{
|
||||||
|
uint64_t res = 0;
|
||||||
|
uint32_t dec32, declets;
|
||||||
|
uint8_t bcd[6];
|
||||||
|
int i, w, sh;
|
||||||
|
decNumber a;
|
||||||
|
|
||||||
|
for (w = 1; w >= 0; w--) {
|
||||||
|
res <<= 32;
|
||||||
|
declets = extract64(s, 32 * w, 20);
|
||||||
|
if (declets) {
|
||||||
|
/* decimal32 with zero exponent and word "w" declets */
|
||||||
|
dec32 = (0x225ULL << 20) | declets;
|
||||||
|
decimal32ToNumber((decimal32 *)&dec32, &a);
|
||||||
|
decNumberGetBCD(&a, bcd);
|
||||||
|
for (i = 0; i < a.digits; i++) {
|
||||||
|
sh = 4 * (a.digits - 1 - i);
|
||||||
|
res |= (uint64_t)bcd[i] << sh;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
target_ulong helper_CBCDTD(target_ulong s)
|
target_ulong helper_CBCDTD(target_ulong s)
|
||||||
{
|
{
|
||||||
uint64_t res = 0;
|
uint64_t res = 0;
|
||||||
|
|
|
@ -54,6 +54,7 @@ DEF_HELPER_3(sraw, tl, env, tl, tl)
|
||||||
DEF_HELPER_FLAGS_2(CFUGED, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
DEF_HELPER_FLAGS_2(CFUGED, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
||||||
DEF_HELPER_FLAGS_2(PDEPD, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
DEF_HELPER_FLAGS_2(PDEPD, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
||||||
DEF_HELPER_FLAGS_2(PEXTD, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
DEF_HELPER_FLAGS_2(PEXTD, TCG_CALL_NO_RWG_SE, i64, i64, i64)
|
||||||
|
DEF_HELPER_FLAGS_1(CDTBCD, TCG_CALL_NO_RWG_SE, tl, tl)
|
||||||
DEF_HELPER_FLAGS_1(CBCDTD, TCG_CALL_NO_RWG_SE, tl, tl)
|
DEF_HELPER_FLAGS_1(CBCDTD, TCG_CALL_NO_RWG_SE, tl, tl)
|
||||||
#if defined(TARGET_PPC64)
|
#if defined(TARGET_PPC64)
|
||||||
DEF_HELPER_FLAGS_2(cmpeqb, TCG_CALL_NO_RWG_SE, i32, tl, tl)
|
DEF_HELPER_FLAGS_2(cmpeqb, TCG_CALL_NO_RWG_SE, i32, tl, tl)
|
||||||
|
|
|
@ -317,6 +317,7 @@ PEXTD 011111 ..... ..... ..... 0010111100 - @X
|
||||||
## BCD Assist
|
## BCD Assist
|
||||||
|
|
||||||
ADDG6S 011111 ..... ..... ..... - 001001010 - @X
|
ADDG6S 011111 ..... ..... ..... - 001001010 - @X
|
||||||
|
CDTBCD 011111 ..... ..... ----- 0100011010 - @X_sa
|
||||||
CBCDTD 011111 ..... ..... ----- 0100111010 - @X_sa
|
CBCDTD 011111 ..... ..... ----- 0100111010 - @X_sa
|
||||||
|
|
||||||
### Float-Point Load Instructions
|
### Float-Point Load Instructions
|
||||||
|
|
|
@ -530,6 +530,13 @@ static bool trans_ADDG6S(DisasContext *ctx, arg_X *a)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool trans_CDTBCD(DisasContext *ctx, arg_X_sa *a)
|
||||||
|
{
|
||||||
|
REQUIRE_INSNS_FLAGS2(ctx, BCDA_ISA206);
|
||||||
|
gen_helper_CDTBCD(cpu_gpr[a->ra], cpu_gpr[a->rs]);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static bool trans_CBCDTD(DisasContext *ctx, arg_X_sa *a)
|
static bool trans_CBCDTD(DisasContext *ctx, arg_X_sa *a)
|
||||||
{
|
{
|
||||||
REQUIRE_INSNS_FLAGS2(ctx, BCDA_ISA206);
|
REQUIRE_INSNS_FLAGS2(ctx, BCDA_ISA206);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue