[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 11/12] Hexagon (target/hexagon) make VyV operands use a unique
From: |
Taylor Simpson |
Subject: |
[PATCH v2 11/12] Hexagon (target/hexagon) make VyV operands use a unique temp |
Date: |
Wed, 9 Feb 2022 18:15:55 -0800 |
VyV operand is only used in the vshuff and vdeal instructions. These
instructions write to both VyV and VxV operands. In the case where
both operands are the same register, we need a separate location for
VyV. We use the existing vtmp field in CPUHexagonState.
Test case added in tests/tcg/hexagon/hvx_misc.c
Signed-off-by: Taylor Simpson <tsimpson@quicinc.com>
---
tests/tcg/hexagon/hvx_misc.c | 45 +++++++++++++++++++++++++++++++++
target/hexagon/gen_tcg_funcs.py | 9 +++----
2 files changed, 49 insertions(+), 5 deletions(-)
diff --git a/tests/tcg/hexagon/hvx_misc.c b/tests/tcg/hexagon/hvx_misc.c
index b896f5897e..6e2c9ab3cd 100644
--- a/tests/tcg/hexagon/hvx_misc.c
+++ b/tests/tcg/hexagon/hvx_misc.c
@@ -498,6 +498,49 @@ static void test_vsubuwsat_dv(void)
check_output_w(__LINE__, 2);
}
+static void test_vshuff(void)
+{
+ /* Test that vshuff works when the two operands are the same register */
+ const uint32_t splat = 0x089be55c;
+ const uint32_t shuff = 0x454fa926;
+ MMVector v0, v1;
+
+ memset(expect, 0x12, sizeof(MMVector));
+ memset(output, 0x34, sizeof(MMVector));
+
+ asm volatile("v25 = vsplat(%0)\n\t"
+ "vshuff(v25, v25, %1)\n\t"
+ "vmem(%2 + #0) = v25\n\t"
+ : /* no outputs */
+ : "r"(splat), "r"(shuff), "r"(output)
+ : "v25", "memory");
+
+ /*
+ * The semantics of Hexagon are the operands are pass-by-value, so create
+ * two copies of the vsplat result.
+ */
+ for (int i = 0; i < MAX_VEC_SIZE_BYTES / 4; i++) {
+ v0.uw[i] = splat;
+ v1.uw[i] = splat;
+ }
+ /* Do the vshuff operation */
+ for (int offset = 1; offset < MAX_VEC_SIZE_BYTES; offset <<= 1) {
+ if (shuff & offset) {
+ for (int k = 0; k < MAX_VEC_SIZE_BYTES; k++) {
+ if (!(k & offset)) {
+ uint8_t tmp = v0.ub[k];
+ v0.ub[k] = v1.ub[k + offset];
+ v1.ub[k + offset] = tmp;
+ }
+ }
+ }
+ }
+ /* Put the result in the expect buffer for verification */
+ expect[0] = v1;
+
+ check_output_b(__LINE__, 1);
+}
+
int main()
{
init_buffers();
@@ -533,6 +576,8 @@ int main()
test_vadduwsat();
test_vsubuwsat_dv();
+ test_vshuff();
+
puts(err ? "FAIL" : "PASS");
return err ? 1 : 0;
}
diff --git a/target/hexagon/gen_tcg_funcs.py b/target/hexagon/gen_tcg_funcs.py
index 1fd9de95d5..d72c689ad7 100755
--- a/target/hexagon/gen_tcg_funcs.py
+++ b/target/hexagon/gen_tcg_funcs.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python3
##
-## Copyright(c) 2019-2021 Qualcomm Innovation Center, Inc. All Rights
Reserved.
+## Copyright(c) 2019-2022 Qualcomm Innovation Center, Inc. All Rights
Reserved.
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
@@ -164,7 +164,9 @@ def genptr_decl(f, tag, regtype, regid, regno):
(regtype, regid, regno))
f.write(" const intptr_t %s%sV_off =\n" % \
(regtype, regid))
- if (hex_common.is_tmp_result(tag)):
+ if (regid == "y"):
+ f.write(" offsetof(CPUHexagonState, vtmp);\n")
+ elif (hex_common.is_tmp_result(tag)):
f.write(" ctx_tmp_vreg_off(ctx, %s%sN, 1, true);\n" % \
(regtype, regid))
else:
@@ -379,9 +381,6 @@ def genptr_src_read(f, tag, regtype, regid):
f.write(" vreg_src_off(ctx, %s%sN),\n" % \
(regtype, regid))
f.write(" sizeof(MMVector), sizeof(MMVector));\n")
- if (not hex_common.skip_qemu_helper(tag)):
- f.write(" tcg_gen_addi_ptr(%s%sV, cpu_env, %s%sV_off);\n" %
\
- (regtype, regid, regtype, regid))
else:
print("Bad register parse: ", regtype, regid)
elif (regtype == "Q"):
--
2.17.1
- [PATCH v2 10/12] Hexagon (target/hexagon) fix bug in conv_df2uw_chop, (continued)
- [PATCH v2 10/12] Hexagon (target/hexagon) fix bug in conv_df2uw_chop, Taylor Simpson, 2022/02/09
- [PATCH v2 03/12] Hexagon (target/hexagon) properly set FPINVF bit in sfcmp.uo and dfcmp.uo, Taylor Simpson, 2022/02/09
- [PATCH v2 08/12] Hexagon (tests/tcg/hexagon) update overflow test, Taylor Simpson, 2022/02/09
- [PATCH v2 12/12] Hexagon (target/hexagon) assignment to c4 should wait until packet commit, Taylor Simpson, 2022/02/09
- [PATCH v2 04/12] Hexagon (target/hexagon) properly handle SNaN in dfmin/dfmax/sfmin/sfmax, Taylor Simpson, 2022/02/09
- [PATCH v2 11/12] Hexagon (target/hexagon) make VyV operands use a unique temp,
Taylor Simpson <=
- [PATCH v2 05/12] Hexagon (target/hexagon) properly handle denorm in arch_sf_recip_common, Taylor Simpson, 2022/02/09
- [PATCH v2 06/12] Hexagon (tests/tcg/hexagon) test instructions that might set bits in USR, Taylor Simpson, 2022/02/09
- [PATCH v2 09/12] Hexagon (tests/tcg/hexagon) fix inline asm in preg_alias.c, Taylor Simpson, 2022/02/09
- [PATCH v2 01/12] Hexagon (target/hexagon) fix bug in circular addressing, Taylor Simpson, 2022/02/09
- [PATCH v2 07/12] Hexagon (tests/tcg/hexagon) add floating point instructions to usr.c, Taylor Simpson, 2022/02/09