[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 02/28] tcg/i386: Support bswap flags
From: |
Richard Henderson |
Subject: |
[PATCH 02/28] tcg/i386: Support bswap flags |
Date: |
Mon, 14 Jun 2021 01:37:34 -0700 |
Retain the current rorw bswap16 expansion for the zero-in/zero-out case.
Otherwise, perform a wider bswap plus a right-shift or extend.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
tcg/i386/tcg-target.c.inc | 20 +++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
index 34113388ef..98d924b91a 100644
--- a/tcg/i386/tcg-target.c.inc
+++ b/tcg/i386/tcg-target.c.inc
@@ -2421,10 +2421,28 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode
opc,
break;
OP_32_64(bswap16):
- tcg_out_rolw_8(s, a0);
+ if (a2 & TCG_BSWAP_OS) {
+ /* Output must be sign-extended. */
+ if (rexw) {
+ tcg_out_bswap64(s, a0);
+ tcg_out_shifti(s, SHIFT_SAR + rexw, a0, 48);
+ } else {
+ tcg_out_bswap32(s, a0);
+ tcg_out_shifti(s, SHIFT_SAR, a0, 16);
+ }
+ } else if ((a2 & (TCG_BSWAP_IZ | TCG_BSWAP_OZ)) == TCG_BSWAP_OZ) {
+ /* Output must be zero-extended, but input isn't. */
+ tcg_out_bswap32(s, a0);
+ tcg_out_shifti(s, SHIFT_SHR, a0, 16);
+ } else {
+ tcg_out_rolw_8(s, a0);
+ }
break;
OP_32_64(bswap32):
tcg_out_bswap32(s, a0);
+ if (rexw && (a2 & TCG_BSWAP_OS)) {
+ tcg_out_ext32s(s, a0, a0);
+ }
break;
OP_32_64(neg):
--
2.25.1
- Re: [PATCH 05/28] tcg/ppc: Split out tcg_out_ext{8,16,32}s, (continued)
[PATCH 02/28] tcg/i386: Support bswap flags,
Richard Henderson <=
[PATCH 06/28] tcg/ppc: Split out tcg_out_sari{32,64}, Richard Henderson, 2021/06/14
[PATCH 08/28] tcg/ppc: Split out tcg_out_bswap32, Richard Henderson, 2021/06/14
[PATCH 07/28] tcg/ppc: Split out tcg_out_bswap16, Richard Henderson, 2021/06/14
[PATCH 10/28] tcg/ppc: Support bswap flags, Richard Henderson, 2021/06/14