* [Qemu-devel] [PULL 2/4] tcg-ppc64: bswap64 rotates output 32 bits
2013-06-17 17:45 [Qemu-devel] [PULL 0/4] Fix ppc64 tcg issues Richard Henderson
2013-06-17 17:45 ` [Qemu-devel] [PULL 1/4] tcg-ppc64: Fix RLDCL opcode Richard Henderson
@ 2013-06-17 17:45 ` Richard Henderson
2013-06-17 17:45 ` [Qemu-devel] [PULL 3/4] tcg-ppc64: Fix add2_i64 Richard Henderson
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Richard Henderson @ 2013-06-17 17:45 UTC (permalink / raw)
To: qemu-devel; +Cc: aliguori, Anton Blanchard, qemu-stable
From: Anton Blanchard <anton@samba.org>
If our input and output is in the same register, bswap64 tries to
undo a rotate of the input. This just ends up rotating the output.
Cc: qemu-stable@nongnu.org
Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
tcg/ppc64/tcg-target.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/tcg/ppc64/tcg-target.c b/tcg/ppc64/tcg-target.c
index c7c0b8f..1d06530 100644
--- a/tcg/ppc64/tcg-target.c
+++ b/tcg/ppc64/tcg-target.c
@@ -1923,8 +1923,6 @@ static void tcg_out_op (TCGContext *s, TCGOpcode opc, const TCGArg *args,
if (a0 == 0) {
tcg_out_mov(s, TCG_TYPE_I64, args[0], a0);
- /* Revert the source rotate that we performed above. */
- tcg_out_rld(s, RLDICL, a1, a1, 32, 0);
}
break;
--
1.8.1.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PULL 3/4] tcg-ppc64: Fix add2_i64
2013-06-17 17:45 [Qemu-devel] [PULL 0/4] Fix ppc64 tcg issues Richard Henderson
2013-06-17 17:45 ` [Qemu-devel] [PULL 1/4] tcg-ppc64: Fix RLDCL opcode Richard Henderson
2013-06-17 17:45 ` [Qemu-devel] [PULL 2/4] tcg-ppc64: bswap64 rotates output 32 bits Richard Henderson
@ 2013-06-17 17:45 ` Richard Henderson
2013-06-17 17:45 ` [Qemu-devel] [PULL 4/4] tcg-ppc64: rotr_i32 rotates wrong amount Richard Henderson
2013-06-17 21:17 ` [Qemu-devel] [PULL 0/4] Fix ppc64 tcg issues Anthony Liguori
4 siblings, 0 replies; 6+ messages in thread
From: Richard Henderson @ 2013-06-17 17:45 UTC (permalink / raw)
To: qemu-devel; +Cc: aliguori, Anton Blanchard, qemu-stable
From: Anton Blanchard <anton@samba.org>
add2_i64 was adding the lower double word to the upper double word
of each input. Fix this so we add the lower double words, then the
upper double words with carry propagation.
Cc: qemu-stable@nongnu.org
Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
tcg/ppc64/tcg-target.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/tcg/ppc64/tcg-target.c b/tcg/ppc64/tcg-target.c
index 1d06530..5cdff36 100644
--- a/tcg/ppc64/tcg-target.c
+++ b/tcg/ppc64/tcg-target.c
@@ -1959,18 +1959,18 @@ static void tcg_out_op (TCGContext *s, TCGOpcode opc, const TCGArg *args,
environment. So in 64-bit mode it's always carry-out of bit 63.
The fallback code using deposit works just as well for 32-bit. */
a0 = args[0], a1 = args[1];
- if (a0 == args[4] || (!const_args[5] && a0 == args[5])) {
+ if (a0 == args[3] || (!const_args[5] && a0 == args[5])) {
a0 = TCG_REG_R0;
}
- if (const_args[3]) {
- tcg_out32(s, ADDIC | TAI(a0, args[2], args[3]));
+ if (const_args[4]) {
+ tcg_out32(s, ADDIC | TAI(a0, args[2], args[4]));
} else {
- tcg_out32(s, ADDC | TAB(a0, args[2], args[3]));
+ tcg_out32(s, ADDC | TAB(a0, args[2], args[4]));
}
if (const_args[5]) {
- tcg_out32(s, (args[5] ? ADDME : ADDZE) | RT(a1) | RA(args[4]));
+ tcg_out32(s, (args[5] ? ADDME : ADDZE) | RT(a1) | RA(args[3]));
} else {
- tcg_out32(s, ADDE | TAB(a1, args[4], args[5]));
+ tcg_out32(s, ADDE | TAB(a1, args[3], args[5]));
}
if (a0 != args[0]) {
tcg_out_mov(s, TCG_TYPE_I64, args[0], a0);
@@ -2148,7 +2148,7 @@ static const TCGTargetOpDef ppc_op_defs[] = {
{ INDEX_op_deposit_i32, { "r", "0", "rZ" } },
{ INDEX_op_deposit_i64, { "r", "0", "rZ" } },
- { INDEX_op_add2_i64, { "r", "r", "r", "rI", "r", "rZM" } },
+ { INDEX_op_add2_i64, { "r", "r", "r", "r", "rI", "rZM" } },
{ INDEX_op_sub2_i64, { "r", "r", "rI", "r", "rZM", "r" } },
{ INDEX_op_muls2_i64, { "r", "r", "r", "r" } },
{ INDEX_op_mulu2_i64, { "r", "r", "r", "r" } },
--
1.8.1.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PULL 4/4] tcg-ppc64: rotr_i32 rotates wrong amount
2013-06-17 17:45 [Qemu-devel] [PULL 0/4] Fix ppc64 tcg issues Richard Henderson
` (2 preceding siblings ...)
2013-06-17 17:45 ` [Qemu-devel] [PULL 3/4] tcg-ppc64: Fix add2_i64 Richard Henderson
@ 2013-06-17 17:45 ` Richard Henderson
2013-06-17 21:17 ` [Qemu-devel] [PULL 0/4] Fix ppc64 tcg issues Anthony Liguori
4 siblings, 0 replies; 6+ messages in thread
From: Richard Henderson @ 2013-06-17 17:45 UTC (permalink / raw)
To: qemu-devel; +Cc: aliguori, Anton Blanchard, qemu-stable
From: Anton Blanchard <anton@samba.org>
rotr_i32 calculates the amount to left shift and puts it into a
temporary, but then doesn't use it when doing the shift.
Cc: qemu-stable@nongnu.org
Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
tcg/ppc64/tcg-target.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tcg/ppc64/tcg-target.c b/tcg/ppc64/tcg-target.c
index 5cdff36..606b73d 100644
--- a/tcg/ppc64/tcg-target.c
+++ b/tcg/ppc64/tcg-target.c
@@ -1662,7 +1662,7 @@ static void tcg_out_op (TCGContext *s, TCGOpcode opc, const TCGArg *args,
tcg_out_rlw(s, RLWINM, args[0], args[1], 32 - args[2], 0, 31);
} else {
tcg_out32(s, SUBFIC | TAI(0, args[2], 32));
- tcg_out32(s, RLWNM | SAB(args[1], args[0], args[2])
+ tcg_out32(s, RLWNM | SAB(args[1], args[0], 0)
| MB(0) | ME(31));
}
break;
--
1.8.1.4
^ permalink raw reply related [flat|nested] 6+ messages in thread