* [PATCH v2 00/11] TriCore 1.6.2 insn and bugfixes
@ 2023-08-28 11:26 Bastian Koppelmann
2023-08-28 11:26 ` [PATCH v2 01/11] tests/tcg/tricore: Bump cpu to tc37x Bastian Koppelmann
` (10 more replies)
0 siblings, 11 replies; 19+ messages in thread
From: Bastian Koppelmann @ 2023-08-28 11:26 UTC (permalink / raw)
To: qemu-devel; +Cc: anton.kochkov, richard.henderson, kbastian
Hi,
this series implements the insns reported in [1], as well as ftou. Also I fixed
two bugs in the insert insn which I came across during testing.
Cheers,
Bastian
[1] https://gitlab.com/qemu-project/qemu/-/issues/1667
v1 -> v2:
- Removed useless deposits in crc_div()
- Replaced final deposit() with extract() in helper_crcn()
- Add trap if not feature_162 (CRCN)
- Removed special case for NAN input (FTOU)
- Clarified why we need arg < 0.0 special case (FTOU, FTOUZ)
- Removed special case for f_arg being infinity (ftohp, hptof)
- Clarified, why we need a special case for arg being NAN (ftohp, hptof)
Bastian Koppelmann (11):
tests/tcg/tricore: Bump cpu to tc37x
target/tricore: Implement CRCN insn
target/tricore: Correctly handle FPU RM from PSW
target/tricore: Implement FTOU insn
target/tricore: Clarify special case for FTOUZ insn
target/tricore: Implement ftohp insn
target/tricore: Implement hptof insn
target/tricore: Fix RCPW/RRPW_INSERT insns for width = 0
target/tricore: Swap src and dst reg for RCRR_INSERT
target/tricore: Replace cpu_*_code with translator_*
target/tricore: Fix FTOUZ being ISA v1.3.1 up
target/tricore/fpu_helper.c | 111 ++++++++++++++++++++++
target/tricore/helper.c | 19 +++-
target/tricore/helper.h | 4 +
target/tricore/op_helper.c | 63 ++++++++++++
target/tricore/translate.c | 56 +++++++++--
target/tricore/tricore-opcodes.h | 3 +
tests/tcg/tricore/Makefile.softmmu-target | 6 +-
tests/tcg/tricore/asm/macros.h | 24 +++++
tests/tcg/tricore/asm/test_crcn.S | 9 ++
tests/tcg/tricore/asm/test_ftohp.S | 14 +++
tests/tcg/tricore/asm/test_ftou.S | 12 +++
tests/tcg/tricore/asm/test_hptof.S | 12 +++
tests/tcg/tricore/asm/test_insert.S | 14 +++
13 files changed, 334 insertions(+), 13 deletions(-)
create mode 100644 tests/tcg/tricore/asm/test_crcn.S
create mode 100644 tests/tcg/tricore/asm/test_ftohp.S
create mode 100644 tests/tcg/tricore/asm/test_ftou.S
create mode 100644 tests/tcg/tricore/asm/test_hptof.S
--
2.41.0
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v2 01/11] tests/tcg/tricore: Bump cpu to tc37x
2023-08-28 11:26 [PATCH v2 00/11] TriCore 1.6.2 insn and bugfixes Bastian Koppelmann
@ 2023-08-28 11:26 ` Bastian Koppelmann
2023-08-28 11:26 ` [PATCH v2 02/11] target/tricore: Implement CRCN insn Bastian Koppelmann
` (9 subsequent siblings)
10 siblings, 0 replies; 19+ messages in thread
From: Bastian Koppelmann @ 2023-08-28 11:26 UTC (permalink / raw)
To: qemu-devel; +Cc: anton.kochkov, richard.henderson, kbastian
we don't want to exclude ISA v1.6.2 insns from our tests.
Acked-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Bastian Koppelmann <kbastian@mail.uni-paderborn.de>
---
tests/tcg/tricore/Makefile.softmmu-target | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/tcg/tricore/Makefile.softmmu-target b/tests/tcg/tricore/Makefile.softmmu-target
index aff7c1b580..f8fd207921 100644
--- a/tests/tcg/tricore/Makefile.softmmu-target
+++ b/tests/tcg/tricore/Makefile.softmmu-target
@@ -25,7 +25,7 @@ TESTS += test_muls.asm.tst
TESTS += test_boot_to_main.c.tst
TESTS += test_context_save_areas.c.tst
-QEMU_OPTS += -M tricore_testboard -cpu tc27x -nographic -kernel
+QEMU_OPTS += -M tricore_testboard -cpu tc37x -nographic -kernel
%.pS: $(ASM_TESTS_PATH)/%.S
$(HOST_CC) -E -o $@ $<
--
2.41.0
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v2 02/11] target/tricore: Implement CRCN insn
2023-08-28 11:26 [PATCH v2 00/11] TriCore 1.6.2 insn and bugfixes Bastian Koppelmann
2023-08-28 11:26 ` [PATCH v2 01/11] tests/tcg/tricore: Bump cpu to tc37x Bastian Koppelmann
@ 2023-08-28 11:26 ` Bastian Koppelmann
2023-08-28 18:09 ` Richard Henderson
2023-08-28 11:26 ` [PATCH v2 03/11] target/tricore: Correctly handle FPU RM from PSW Bastian Koppelmann
` (8 subsequent siblings)
10 siblings, 1 reply; 19+ messages in thread
From: Bastian Koppelmann @ 2023-08-28 11:26 UTC (permalink / raw)
To: qemu-devel; +Cc: anton.kochkov, richard.henderson, kbastian
reported in https://gitlab.com/qemu-project/qemu/-/issues/1667
Signed-off-by: Bastian Koppelmann <kbastian@mail.uni-paderborn.de>
---
v1 -> v2:
- Removed useless deposits in crc_div()
- Replaced final deposit() with extract() in helper_crcn()
- Add trap for CRCN insn if not feature_162
target/tricore/helper.h | 1 +
target/tricore/op_helper.c | 63 +++++++++++++++++++++++
target/tricore/translate.c | 8 +++
target/tricore/tricore-opcodes.h | 1 +
tests/tcg/tricore/Makefile.softmmu-target | 1 +
tests/tcg/tricore/asm/test_crcn.S | 9 ++++
6 files changed, 83 insertions(+)
create mode 100644 tests/tcg/tricore/asm/test_crcn.S
diff --git a/target/tricore/helper.h b/target/tricore/helper.h
index 31d71eac7a..190645413a 100644
--- a/target/tricore/helper.h
+++ b/target/tricore/helper.h
@@ -134,6 +134,7 @@ DEF_HELPER_FLAGS_5(mulr_h, TCG_CALL_NO_RWG_SE, i32, i32, i32, i32, i32, i32)
DEF_HELPER_FLAGS_2(crc32b, TCG_CALL_NO_RWG_SE, i32, i32, i32)
DEF_HELPER_FLAGS_2(crc32_be, TCG_CALL_NO_RWG_SE, i32, i32, i32)
DEF_HELPER_FLAGS_2(crc32_le, TCG_CALL_NO_RWG_SE, i32, i32, i32)
+DEF_HELPER_FLAGS_3(crcn, TCG_CALL_NO_RWG_SE, i32, i32, i32, i32)
DEF_HELPER_FLAGS_2(shuffle, TCG_CALL_NO_RWG_SE, i32, i32, i32)
/* CSA */
DEF_HELPER_2(call, void, env, i32)
diff --git a/target/tricore/op_helper.c b/target/tricore/op_helper.c
index 89be1ed648..0cf8eb50bd 100644
--- a/target/tricore/op_helper.c
+++ b/target/tricore/op_helper.c
@@ -2308,6 +2308,69 @@ uint32_t helper_crc32_le(uint32_t arg0, uint32_t arg1)
return crc32(arg1, buf, 4);
}
+static uint32_t crc_div(uint32_t crc_in, uint32_t data, uint32_t gen,
+ uint32_t n, uint32_t m)
+{
+ uint32_t i;
+
+ data = data << n;
+ for (i = 0; i < m; i++) {
+ if (crc_in & (1u << (n - 1))) {
+ crc_in <<= 1;
+ if (data & (1u << (m - 1))) {
+ crc_in++;
+ }
+ crc_in ^= gen;
+ } else {
+ crc_in <<= 1;
+ if (data & (1u << (m - 1))) {
+ crc_in++;
+ }
+ }
+ data <<= 1;
+ }
+
+ return crc_in;
+}
+
+uint32_t helper_crcn(uint32_t arg0, uint32_t arg1, uint32_t arg2)
+{
+ uint32_t crc_out, crc_in;
+ uint32_t n = extract32(arg0, 12, 4) + 1;
+ uint32_t gen = extract32(arg0, 16, n);
+ uint32_t inv = extract32(arg0, 9, 1);
+ uint32_t le = extract32(arg0, 8, 1);
+ uint32_t m = extract32(arg0, 0, 3) + 1;
+ uint32_t data = extract32(arg1, 0, m);
+ uint32_t seed = extract32(arg2, 0, n);
+
+ if (le == 1) {
+ if (m == 0) {
+ data = 0;
+ } else {
+ data = revbit32(data) >> (32 - m);
+ }
+ }
+
+ if (inv == 1) {
+ seed = ~seed;
+ }
+
+ if (m > n) {
+ crc_in = (data >> (m - n)) ^ seed;
+ } else {
+ crc_in = (data << (n - m)) ^ seed;
+ }
+
+ crc_out = crc_div(crc_in, data, gen, n, m);
+
+ if (inv) {
+ crc_out = ~crc_out;
+ }
+
+ return extract32(crc_out, 0, n);
+}
+
uint32_t helper_shuffle(uint32_t arg0, uint32_t arg1)
{
uint32_t resb;
diff --git a/target/tricore/translate.c b/target/tricore/translate.c
index 1947733870..c2ef84af08 100644
--- a/target/tricore/translate.c
+++ b/target/tricore/translate.c
@@ -6673,6 +6673,14 @@ static void decode_rrr_divide(DisasContext *ctx)
gen_helper_pack(cpu_gpr_d[r4], cpu_PSW_C, cpu_gpr_d[r3],
cpu_gpr_d[r3+1], cpu_gpr_d[r1]);
break;
+ case OPC2_32_RRR_CRCN:
+ if (has_feature(ctx, TRICORE_FEATURE_162)) {
+ gen_helper_crcn(cpu_gpr_d[r4], cpu_gpr_d[r1], cpu_gpr_d[r2],
+ cpu_gpr_d[r3]);
+ } else {
+ generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
+ }
+ break;
case OPC2_32_RRR_ADD_F:
gen_helper_fadd(cpu_gpr_d[r4], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r3]);
break;
diff --git a/target/tricore/tricore-opcodes.h b/target/tricore/tricore-opcodes.h
index bc62b73173..f070571665 100644
--- a/target/tricore/tricore-opcodes.h
+++ b/target/tricore/tricore-opcodes.h
@@ -1247,6 +1247,7 @@ enum {
OPC2_32_RRR_SUB_F = 0x03,
OPC2_32_RRR_MADD_F = 0x06,
OPC2_32_RRR_MSUB_F = 0x07,
+ OPC2_32_RRR_CRCN = 0x01, /* 1.6.2 up */
};
/*
* RRR1 Format
diff --git a/tests/tcg/tricore/Makefile.softmmu-target b/tests/tcg/tricore/Makefile.softmmu-target
index f8fd207921..7a7d73a60c 100644
--- a/tests/tcg/tricore/Makefile.softmmu-target
+++ b/tests/tcg/tricore/Makefile.softmmu-target
@@ -9,6 +9,7 @@ CFLAGS = -mtc162 -c -I$(TESTS_PATH)
TESTS += test_abs.asm.tst
TESTS += test_bmerge.asm.tst
TESTS += test_clz.asm.tst
+TESTS += test_crcn.asm.tst
TESTS += test_dextr.asm.tst
TESTS += test_dvstep.asm.tst
TESTS += test_fadd.asm.tst
diff --git a/tests/tcg/tricore/asm/test_crcn.S b/tests/tcg/tricore/asm/test_crcn.S
new file mode 100644
index 0000000000..51a22722a3
--- /dev/null
+++ b/tests/tcg/tricore/asm/test_crcn.S
@@ -0,0 +1,9 @@
+#include "macros.h"
+.text
+.global _start
+_start:
+# insn num result rs1 rs2 rs3
+# | | | | | |
+ TEST_D_DDD(crcn, 1, 0x00002bed, 0x0, 0xa10ddeed, 0x0)
+
+ TEST_PASSFAIL
--
2.41.0
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v2 03/11] target/tricore: Correctly handle FPU RM from PSW
2023-08-28 11:26 [PATCH v2 00/11] TriCore 1.6.2 insn and bugfixes Bastian Koppelmann
2023-08-28 11:26 ` [PATCH v2 01/11] tests/tcg/tricore: Bump cpu to tc37x Bastian Koppelmann
2023-08-28 11:26 ` [PATCH v2 02/11] target/tricore: Implement CRCN insn Bastian Koppelmann
@ 2023-08-28 11:26 ` Bastian Koppelmann
2023-08-28 11:26 ` [PATCH v2 04/11] target/tricore: Implement FTOU insn Bastian Koppelmann
` (7 subsequent siblings)
10 siblings, 0 replies; 19+ messages in thread
From: Bastian Koppelmann @ 2023-08-28 11:26 UTC (permalink / raw)
To: qemu-devel; +Cc: anton.kochkov, richard.henderson, kbastian
when we reconstructed PSW using psw_read(), we were trying to clear the
cached USB bits out of env->PSW. The mask was wrong and we would clear
PSW.RM as well.
when we write the PSW using psw_write() we update the rounding modes in
env->fp_status for softfloat. The order of bits used by TriCore is not
the one used by softfloat.
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Bastian Koppelmann <kbastian@mail.uni-paderborn.de>
---
target/tricore/helper.c | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/target/tricore/helper.c b/target/tricore/helper.c
index 6d076ac36f..e615c3d6d4 100644
--- a/target/tricore/helper.c
+++ b/target/tricore/helper.c
@@ -120,7 +120,21 @@ void tricore_cpu_list(void)
void fpu_set_state(CPUTriCoreState *env)
{
- set_float_rounding_mode(env->PSW & MASK_PSW_FPU_RM, &env->fp_status);
+ switch (extract32(env->PSW, 24, 2)) {
+ case 0:
+ set_float_rounding_mode(float_round_nearest_even, &env->fp_status);
+ break;
+ case 1:
+ set_float_rounding_mode(float_round_up, &env->fp_status);
+ break;
+ case 2:
+ set_float_rounding_mode(float_round_down, &env->fp_status);
+ break;
+ case 3:
+ set_float_rounding_mode(float_round_to_zero, &env->fp_status);
+ break;
+ }
+
set_flush_inputs_to_zero(1, &env->fp_status);
set_flush_to_zero(1, &env->fp_status);
set_default_nan_mode(1, &env->fp_status);
@@ -129,7 +143,7 @@ void fpu_set_state(CPUTriCoreState *env)
uint32_t psw_read(CPUTriCoreState *env)
{
/* clear all USB bits */
- env->PSW &= 0x6ffffff;
+ env->PSW &= 0x7ffffff;
/* now set them from the cache */
env->PSW |= ((env->PSW_USB_C != 0) << 31);
env->PSW |= ((env->PSW_USB_V & (1 << 31)) >> 1);
--
2.41.0
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v2 04/11] target/tricore: Implement FTOU insn
2023-08-28 11:26 [PATCH v2 00/11] TriCore 1.6.2 insn and bugfixes Bastian Koppelmann
` (2 preceding siblings ...)
2023-08-28 11:26 ` [PATCH v2 03/11] target/tricore: Correctly handle FPU RM from PSW Bastian Koppelmann
@ 2023-08-28 11:26 ` Bastian Koppelmann
2023-08-28 18:10 ` Richard Henderson
2023-08-28 11:26 ` [PATCH v2 05/11] target/tricore: Clarify special case for FTOUZ insn Bastian Koppelmann
` (6 subsequent siblings)
10 siblings, 1 reply; 19+ messages in thread
From: Bastian Koppelmann @ 2023-08-28 11:26 UTC (permalink / raw)
To: qemu-devel; +Cc: anton.kochkov, richard.henderson, kbastian
Signed-off-by: Bastian Koppelmann <kbastian@mail.uni-paderborn.de>
---
v1 -> v2:
- Remove special case for NAN input
- Clarified, why we need arg < 0.0 special case
target/tricore/fpu_helper.c | 32 +++++++++++++++++++++++
target/tricore/helper.h | 1 +
target/tricore/translate.c | 3 +++
tests/tcg/tricore/Makefile.softmmu-target | 1 +
tests/tcg/tricore/asm/test_ftou.S | 12 +++++++++
5 files changed, 49 insertions(+)
create mode 100644 tests/tcg/tricore/asm/test_ftou.S
diff --git a/target/tricore/fpu_helper.c b/target/tricore/fpu_helper.c
index cb7ee7dd35..3aefeb776e 100644
--- a/target/tricore/fpu_helper.c
+++ b/target/tricore/fpu_helper.c
@@ -429,6 +429,38 @@ uint32_t helper_ftoiz(CPUTriCoreState *env, uint32_t arg)
return result;
}
+uint32_t helper_ftou(CPUTriCoreState *env, uint32_t arg)
+{
+ float32 f_arg = make_float32(arg);
+ uint32_t result;
+ int32_t flags = 0;
+
+ result = float32_to_uint32(f_arg, &env->fp_status);
+
+ flags = f_get_excp_flags(env);
+ if (flags & float_flag_invalid) {
+ flags &= ~float_flag_inexact;
+ if (float32_is_any_nan(f_arg)) {
+ result = 0;
+ }
+ /*
+ * we need to check arg < 0.0 before rounding as TriCore needs to raise
+ * float_flag_invalid as well. For instance, when we have a negative
+ * exponent and sign, softfloat would only raise float_flat_inexact.
+ */
+ } else if (float32_lt_quiet(f_arg, 0, &env->fp_status)) {
+ flags = float_flag_invalid;
+ result = 0;
+ }
+
+ if (flags) {
+ f_update_psw_flags(env, flags);
+ } else {
+ env->FPU_FS = 0;
+ }
+ return result;
+}
+
uint32_t helper_ftouz(CPUTriCoreState *env, uint32_t arg)
{
float32 f_arg = make_float32(arg);
diff --git a/target/tricore/helper.h b/target/tricore/helper.h
index 190645413a..827fbaa692 100644
--- a/target/tricore/helper.h
+++ b/target/tricore/helper.h
@@ -114,6 +114,7 @@ DEF_HELPER_2(ftoi, i32, env, i32)
DEF_HELPER_2(itof, i32, env, i32)
DEF_HELPER_2(utof, i32, env, i32)
DEF_HELPER_2(ftoiz, i32, env, i32)
+DEF_HELPER_2(ftou, i32, env, i32)
DEF_HELPER_2(ftouz, i32, env, i32)
DEF_HELPER_2(updfl, void, env, i32)
/* dvinit */
diff --git a/target/tricore/translate.c b/target/tricore/translate.c
index c2ef84af08..165297376a 100644
--- a/target/tricore/translate.c
+++ b/target/tricore/translate.c
@@ -6273,6 +6273,9 @@ static void decode_rr_divide(DisasContext *ctx)
case OPC2_32_RR_ITOF:
gen_helper_itof(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1]);
break;
+ case OPC2_32_RR_FTOU:
+ gen_helper_ftou(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1]);
+ break;
case OPC2_32_RR_FTOUZ:
gen_helper_ftouz(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1]);
break;
diff --git a/tests/tcg/tricore/Makefile.softmmu-target b/tests/tcg/tricore/Makefile.softmmu-target
index 7a7d73a60c..e6ed5c56f2 100644
--- a/tests/tcg/tricore/Makefile.softmmu-target
+++ b/tests/tcg/tricore/Makefile.softmmu-target
@@ -15,6 +15,7 @@ TESTS += test_dvstep.asm.tst
TESTS += test_fadd.asm.tst
TESTS += test_fmul.asm.tst
TESTS += test_ftoi.asm.tst
+TESTS += test_ftou.asm.tst
TESTS += test_imask.asm.tst
TESTS += test_insert.asm.tst
TESTS += test_ld_bu.asm.tst
diff --git a/tests/tcg/tricore/asm/test_ftou.S b/tests/tcg/tricore/asm/test_ftou.S
new file mode 100644
index 0000000000..10f106ad62
--- /dev/null
+++ b/tests/tcg/tricore/asm/test_ftou.S
@@ -0,0 +1,12 @@
+#include "macros.h"
+.text
+.global _start
+_start:
+ TEST_D_D(ftou, 1, 0x00000000, 0x1733f6c2)
+ TEST_D_D(ftou, 2, 0x00000000, 0x2c9d9cdc)
+ TEST_D_D(ftou, 3, 0xffffffff, 0x56eb7395)
+ TEST_D_D(ftou, 4, 0x79900800, 0x4ef32010)
+ TEST_D_D(ftou, 5, 0x0353f510, 0x4c54fd44)
+
+ TEST_PASSFAIL
+
--
2.41.0
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v2 05/11] target/tricore: Clarify special case for FTOUZ insn
2023-08-28 11:26 [PATCH v2 00/11] TriCore 1.6.2 insn and bugfixes Bastian Koppelmann
` (3 preceding siblings ...)
2023-08-28 11:26 ` [PATCH v2 04/11] target/tricore: Implement FTOU insn Bastian Koppelmann
@ 2023-08-28 11:26 ` Bastian Koppelmann
2023-08-28 18:11 ` Richard Henderson
2023-08-28 11:26 ` [PATCH v2 06/11] target/tricore: Implement ftohp insn Bastian Koppelmann
` (5 subsequent siblings)
10 siblings, 1 reply; 19+ messages in thread
From: Bastian Koppelmann @ 2023-08-28 11:26 UTC (permalink / raw)
To: qemu-devel; +Cc: anton.kochkov, richard.henderson, kbastian
this is not something other ISAs do, so clarify it with a comment.
Signed-off-by: Bastian Koppelmann <kbastian@mail.uni-paderborn.de>
---
target/tricore/fpu_helper.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/target/tricore/fpu_helper.c b/target/tricore/fpu_helper.c
index 3aefeb776e..d0c474c5f3 100644
--- a/target/tricore/fpu_helper.c
+++ b/target/tricore/fpu_helper.c
@@ -475,6 +475,11 @@ uint32_t helper_ftouz(CPUTriCoreState *env, uint32_t arg)
if (float32_is_any_nan(f_arg)) {
result = 0;
}
+ /*
+ * we need to check arg < 0.0 before rounding as TriCore needs to raise
+ * float_flag_invalid as well. For instance, when we have a negative
+ * exponent and sign, softfloat would only raise float_flat_inexact.
+ */
} else if (float32_lt_quiet(f_arg, 0, &env->fp_status)) {
flags = float_flag_invalid;
result = 0;
--
2.41.0
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v2 06/11] target/tricore: Implement ftohp insn
2023-08-28 11:26 [PATCH v2 00/11] TriCore 1.6.2 insn and bugfixes Bastian Koppelmann
` (4 preceding siblings ...)
2023-08-28 11:26 ` [PATCH v2 05/11] target/tricore: Clarify special case for FTOUZ insn Bastian Koppelmann
@ 2023-08-28 11:26 ` Bastian Koppelmann
2023-08-28 18:15 ` Richard Henderson
2023-08-28 11:26 ` [PATCH v2 07/11] target/tricore: Implement hptof insn Bastian Koppelmann
` (4 subsequent siblings)
10 siblings, 1 reply; 19+ messages in thread
From: Bastian Koppelmann @ 2023-08-28 11:26 UTC (permalink / raw)
To: qemu-devel; +Cc: anton.kochkov, richard.henderson, kbastian
reported in https://gitlab.com/qemu-project/qemu/-/issues/1667
Signed-off-by: Bastian Koppelmann <kbastian@mail.uni-paderborn.de>
---
v1 -> v2:
- Removed special case for f_arg being infinity
- Clarified, why we need a special case for arg being NAN
target/tricore/fpu_helper.c | 38 +++++++++++++++++++++++
target/tricore/helper.c | 1 +
target/tricore/helper.h | 1 +
target/tricore/translate.c | 7 +++++
target/tricore/tricore-opcodes.h | 1 +
tests/tcg/tricore/Makefile.softmmu-target | 1 +
tests/tcg/tricore/asm/test_ftohp.S | 14 +++++++++
7 files changed, 63 insertions(+)
create mode 100644 tests/tcg/tricore/asm/test_ftohp.S
diff --git a/target/tricore/fpu_helper.c b/target/tricore/fpu_helper.c
index d0c474c5f3..848c4a40a0 100644
--- a/target/tricore/fpu_helper.c
+++ b/target/tricore/fpu_helper.c
@@ -373,6 +373,44 @@ uint32_t helper_ftoi(CPUTriCoreState *env, uint32_t arg)
return (uint32_t)result;
}
+uint32_t helper_ftohp(CPUTriCoreState *env, uint32_t arg)
+{
+ float32 f_arg = make_float32(arg);
+ uint32_t result = 0;
+ int32_t flags = 0;
+
+ /*
+ * if we have any NAN we need to move the top 2 and lower 8 input mantissa
+ * bits to the top 2 and lower 8 output mantissa bits respectively.
+ * Softfloat on the other hand uses the top 10 mantissa bits.
+ */
+ if (float32_is_any_nan(f_arg)) {
+ if (float32_is_signaling_nan(f_arg, &env->fp_status)) {
+ flags |= float_flag_invalid;
+ }
+ result = float16_set_sign(result, arg >> 31);
+ result = deposit32(result, 10, 5, 0x1f);
+ result = deposit32(result, 8, 2, extract32(arg, 21, 2));
+ result = deposit32(result, 0, 8, extract32(arg, 0, 8));
+ if (extract32(result, 0, 10) == 0) {
+ result |= (1 << 8);
+ }
+ } else {
+ set_flush_to_zero(0, &env->fp_status);
+ result = float32_to_float16(f_arg, true, &env->fp_status);
+ set_flush_to_zero(1, &env->fp_status);
+ flags = f_get_excp_flags(env);
+ }
+
+ if (flags) {
+ f_update_psw_flags(env, flags);
+ } else {
+ env->FPU_FS = 0;
+ }
+
+ return result;
+}
+
uint32_t helper_itof(CPUTriCoreState *env, uint32_t arg)
{
float32 f_result;
diff --git a/target/tricore/helper.c b/target/tricore/helper.c
index e615c3d6d4..7e5da3cb23 100644
--- a/target/tricore/helper.c
+++ b/target/tricore/helper.c
@@ -137,6 +137,7 @@ void fpu_set_state(CPUTriCoreState *env)
set_flush_inputs_to_zero(1, &env->fp_status);
set_flush_to_zero(1, &env->fp_status);
+ set_float_detect_tininess(float_tininess_before_rounding, &env->fp_status);
set_default_nan_mode(1, &env->fp_status);
}
diff --git a/target/tricore/helper.h b/target/tricore/helper.h
index 827fbaa692..dcc5a492b3 100644
--- a/target/tricore/helper.h
+++ b/target/tricore/helper.h
@@ -111,6 +111,7 @@ DEF_HELPER_4(fmsub, i32, env, i32, i32, i32)
DEF_HELPER_3(fcmp, i32, env, i32, i32)
DEF_HELPER_2(qseed, i32, env, i32)
DEF_HELPER_2(ftoi, i32, env, i32)
+DEF_HELPER_2(ftohp, i32, env, i32)
DEF_HELPER_2(itof, i32, env, i32)
DEF_HELPER_2(utof, i32, env, i32)
DEF_HELPER_2(ftoiz, i32, env, i32)
diff --git a/target/tricore/translate.c b/target/tricore/translate.c
index 165297376a..947e83b492 100644
--- a/target/tricore/translate.c
+++ b/target/tricore/translate.c
@@ -6264,6 +6264,13 @@ static void decode_rr_divide(DisasContext *ctx)
case OPC2_32_RR_DIV_F:
gen_helper_fdiv(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]);
break;
+ case OPC2_32_RR_FTOHP:
+ if (has_feature(ctx, TRICORE_FEATURE_162)) {
+ gen_helper_ftohp(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1]);
+ } else {
+ generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
+ }
+ break;
case OPC2_32_RR_CMP_F:
gen_helper_fcmp(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]);
break;
diff --git a/target/tricore/tricore-opcodes.h b/target/tricore/tricore-opcodes.h
index f070571665..29e655a667 100644
--- a/target/tricore/tricore-opcodes.h
+++ b/target/tricore/tricore-opcodes.h
@@ -1152,6 +1152,7 @@ enum {
OPC2_32_RR_ITOF = 0x14,
OPC2_32_RR_CMP_F = 0x00,
OPC2_32_RR_FTOIZ = 0x13,
+ OPC2_32_RR_FTOHP = 0x25, /* 1.6.2 only */
OPC2_32_RR_FTOQ31 = 0x11,
OPC2_32_RR_FTOQ31Z = 0x18,
OPC2_32_RR_FTOU = 0x12,
diff --git a/tests/tcg/tricore/Makefile.softmmu-target b/tests/tcg/tricore/Makefile.softmmu-target
index e6ed5c56f2..f4a27a83e4 100644
--- a/tests/tcg/tricore/Makefile.softmmu-target
+++ b/tests/tcg/tricore/Makefile.softmmu-target
@@ -14,6 +14,7 @@ TESTS += test_dextr.asm.tst
TESTS += test_dvstep.asm.tst
TESTS += test_fadd.asm.tst
TESTS += test_fmul.asm.tst
+TESTS += test_ftohp.asm.tst
TESTS += test_ftoi.asm.tst
TESTS += test_ftou.asm.tst
TESTS += test_imask.asm.tst
diff --git a/tests/tcg/tricore/asm/test_ftohp.S b/tests/tcg/tricore/asm/test_ftohp.S
new file mode 100644
index 0000000000..9e23141c1e
--- /dev/null
+++ b/tests/tcg/tricore/asm/test_ftohp.S
@@ -0,0 +1,14 @@
+#include "macros.h"
+.text
+.global _start
+_start:
+ TEST_D_D(ftohp, 1, 0xffff, 0xffffffff)
+ TEST_D_D(ftohp, 2, 0xfc00, 0xff800000)
+ TEST_D_D(ftohp, 3, 0x7c00, 0x7f800000)
+ TEST_D_D(ftohp, 4, 0x0, 0x0)
+ TEST_D_D(ftohp, 5, 0x5, 0x34a43580)
+
+ #TEST_D_D_PSW(ftohp, 6, 0x400, 0x8c000b80, 0x387fee74)
+
+ TEST_PASSFAIL
+
--
2.41.0
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v2 07/11] target/tricore: Implement hptof insn
2023-08-28 11:26 [PATCH v2 00/11] TriCore 1.6.2 insn and bugfixes Bastian Koppelmann
` (5 preceding siblings ...)
2023-08-28 11:26 ` [PATCH v2 06/11] target/tricore: Implement ftohp insn Bastian Koppelmann
@ 2023-08-28 11:26 ` Bastian Koppelmann
2023-08-28 18:17 ` Richard Henderson
2023-08-28 11:26 ` [PATCH v2 08/11] target/tricore: Fix RCPW/RRPW_INSERT insns for width = 0 Bastian Koppelmann
` (3 subsequent siblings)
10 siblings, 1 reply; 19+ messages in thread
From: Bastian Koppelmann @ 2023-08-28 11:26 UTC (permalink / raw)
To: qemu-devel; +Cc: anton.kochkov, richard.henderson, kbastian
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1667
Signed-off-by: Bastian Koppelmann <kbastian@mail.uni-paderborn.de>
---
v1 -> v2:
- Removed special case for f_arg being infinity
- Clarified, why we need a special case for arg being NAN
target/tricore/fpu_helper.c | 36 +++++++++++++++++++++++
target/tricore/helper.h | 1 +
target/tricore/translate.c | 7 +++++
target/tricore/tricore-opcodes.h | 1 +
tests/tcg/tricore/Makefile.softmmu-target | 1 +
tests/tcg/tricore/asm/test_hptof.S | 12 ++++++++
6 files changed, 58 insertions(+)
create mode 100644 tests/tcg/tricore/asm/test_hptof.S
diff --git a/target/tricore/fpu_helper.c b/target/tricore/fpu_helper.c
index 848c4a40a0..5d38aea143 100644
--- a/target/tricore/fpu_helper.c
+++ b/target/tricore/fpu_helper.c
@@ -373,6 +373,42 @@ uint32_t helper_ftoi(CPUTriCoreState *env, uint32_t arg)
return (uint32_t)result;
}
+uint32_t helper_hptof(CPUTriCoreState *env, uint32_t arg)
+{
+ float16 f_arg = make_float16(arg);
+ uint32_t result = 0;
+ int32_t flags = 0;
+
+ /*
+ * if we have any NAN we need to move the top 2 and lower 8 input mantissa
+ * bits to the top 2 and lower 8 output mantissa bits respectively.
+ * Softfloat on the other hand uses the top 10 mantissa bits.
+ */
+ if (float16_is_any_nan(f_arg)) {
+ if (float16_is_signaling_nan(f_arg, &env->fp_status)) {
+ flags |= float_flag_invalid;
+ }
+ result = 0;
+ result = float32_set_sign(result, f_arg >> 15);
+ result = deposit32(result, 23, 8, 0xff);
+ result = deposit32(result, 21, 2, extract32(f_arg, 8, 2));
+ result = deposit32(result, 0, 8, extract32(f_arg, 0, 8));
+ } else {
+ set_flush_inputs_to_zero(0, &env->fp_status);
+ result = float16_to_float32(f_arg, true, &env->fp_status);
+ set_flush_inputs_to_zero(1, &env->fp_status);
+ flags = f_get_excp_flags(env);
+ }
+
+ if (flags) {
+ f_update_psw_flags(env, flags);
+ } else {
+ env->FPU_FS = 0;
+ }
+
+ return result;
+}
+
uint32_t helper_ftohp(CPUTriCoreState *env, uint32_t arg)
{
float32 f_arg = make_float32(arg);
diff --git a/target/tricore/helper.h b/target/tricore/helper.h
index dcc5a492b3..1d97d078b0 100644
--- a/target/tricore/helper.h
+++ b/target/tricore/helper.h
@@ -112,6 +112,7 @@ DEF_HELPER_3(fcmp, i32, env, i32, i32)
DEF_HELPER_2(qseed, i32, env, i32)
DEF_HELPER_2(ftoi, i32, env, i32)
DEF_HELPER_2(ftohp, i32, env, i32)
+DEF_HELPER_2(hptof, i32, env, i32)
DEF_HELPER_2(itof, i32, env, i32)
DEF_HELPER_2(utof, i32, env, i32)
DEF_HELPER_2(ftoiz, i32, env, i32)
diff --git a/target/tricore/translate.c b/target/tricore/translate.c
index 947e83b492..c2bac05de1 100644
--- a/target/tricore/translate.c
+++ b/target/tricore/translate.c
@@ -6271,6 +6271,13 @@ static void decode_rr_divide(DisasContext *ctx)
generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
}
break;
+ case OPC2_32_RR_HPTOF:
+ if (has_feature(ctx, TRICORE_FEATURE_162)) {
+ gen_helper_hptof(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1]);
+ } else {
+ generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
+ }
+ break;
case OPC2_32_RR_CMP_F:
gen_helper_fcmp(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1], cpu_gpr_d[r2]);
break;
diff --git a/target/tricore/tricore-opcodes.h b/target/tricore/tricore-opcodes.h
index 29e655a667..60d2402b6e 100644
--- a/target/tricore/tricore-opcodes.h
+++ b/target/tricore/tricore-opcodes.h
@@ -1153,6 +1153,7 @@ enum {
OPC2_32_RR_CMP_F = 0x00,
OPC2_32_RR_FTOIZ = 0x13,
OPC2_32_RR_FTOHP = 0x25, /* 1.6.2 only */
+ OPC2_32_RR_HPTOF = 0x24, /* 1.6.2 only */
OPC2_32_RR_FTOQ31 = 0x11,
OPC2_32_RR_FTOQ31Z = 0x18,
OPC2_32_RR_FTOU = 0x12,
diff --git a/tests/tcg/tricore/Makefile.softmmu-target b/tests/tcg/tricore/Makefile.softmmu-target
index f4a27a83e4..afcf41a977 100644
--- a/tests/tcg/tricore/Makefile.softmmu-target
+++ b/tests/tcg/tricore/Makefile.softmmu-target
@@ -17,6 +17,7 @@ TESTS += test_fmul.asm.tst
TESTS += test_ftohp.asm.tst
TESTS += test_ftoi.asm.tst
TESTS += test_ftou.asm.tst
+TESTS += test_hptof.asm.tst
TESTS += test_imask.asm.tst
TESTS += test_insert.asm.tst
TESTS += test_ld_bu.asm.tst
diff --git a/tests/tcg/tricore/asm/test_hptof.S b/tests/tcg/tricore/asm/test_hptof.S
new file mode 100644
index 0000000000..8adc5e5273
--- /dev/null
+++ b/tests/tcg/tricore/asm/test_hptof.S
@@ -0,0 +1,12 @@
+#include "macros.h"
+.text
+.global _start
+_start:
+ TEST_D_D(hptof, 1, 0xba190000, 0xcc0e90c8)
+ TEST_D_D(hptof, 2, 0x3eaea000, 0x8be23575)
+ TEST_D_D(hptof, 3, 0xc33b8000, 0xcc48d9dc)
+ TEST_D_D(hptof, 4, 0x43e2a000, 0xaef95f15)
+ TEST_D_D(hptof, 5, 0x3d55e000, 0x04932aaf)
+
+ TEST_PASSFAIL
+
--
2.41.0
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v2 08/11] target/tricore: Fix RCPW/RRPW_INSERT insns for width = 0
2023-08-28 11:26 [PATCH v2 00/11] TriCore 1.6.2 insn and bugfixes Bastian Koppelmann
` (6 preceding siblings ...)
2023-08-28 11:26 ` [PATCH v2 07/11] target/tricore: Implement hptof insn Bastian Koppelmann
@ 2023-08-28 11:26 ` Bastian Koppelmann
2023-08-28 12:29 ` Philippe Mathieu-Daudé
2023-08-28 11:26 ` [PATCH v2 09/11] target/tricore: Swap src and dst reg for RCRR_INSERT Bastian Koppelmann
` (2 subsequent siblings)
10 siblings, 1 reply; 19+ messages in thread
From: Bastian Koppelmann @ 2023-08-28 11:26 UTC (permalink / raw)
To: qemu-devel; +Cc: anton.kochkov, richard.henderson, kbastian
we would crash if width was 0 for these insns, as tcg_gen_deposit() is
undefined for that case. For TriCore, width = 0 is a mov from the src reg
to the dst reg, so we special case this here.
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Bastian Koppelmann <kbastian@mail.uni-paderborn.de>
---
target/tricore/translate.c | 10 ++++++++--
tests/tcg/tricore/asm/macros.h | 15 +++++++++++++++
tests/tcg/tricore/asm/test_insert.S | 9 +++++++++
3 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/target/tricore/translate.c b/target/tricore/translate.c
index c2bac05de1..ee04434f26 100644
--- a/target/tricore/translate.c
+++ b/target/tricore/translate.c
@@ -5317,8 +5317,11 @@ static void decode_rcpw_insert(DisasContext *ctx)
}
break;
case OPC2_32_RCPW_INSERT:
+ /* tcg_gen_deposit_tl() does not handle the case of width = 0 */
+ if (width == 0) {
+ tcg_gen_mov_tl(cpu_gpr_d[r2], cpu_gpr_d[r1]);
/* if pos + width > 32 undefined result */
- if (pos + width <= 32) {
+ } else if (pos + width <= 32) {
temp = tcg_constant_i32(const4);
tcg_gen_deposit_tl(cpu_gpr_d[r2], cpu_gpr_d[r1], temp, pos, width);
}
@@ -6575,7 +6578,10 @@ static void decode_rrpw_extract_insert(DisasContext *ctx)
break;
case OPC2_32_RRPW_INSERT:
- if (pos + width <= 32) {
+ /* tcg_gen_deposit_tl() does not handle the case of width = 0 */
+ if (width == 0) {
+ tcg_gen_mov_tl(cpu_gpr_d[r3], cpu_gpr_d[r1]);
+ } else if (pos + width <= 32) {
tcg_gen_deposit_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
pos, width);
}
diff --git a/tests/tcg/tricore/asm/macros.h b/tests/tcg/tricore/asm/macros.h
index b5087b5c97..51f6191ef2 100644
--- a/tests/tcg/tricore/asm/macros.h
+++ b/tests/tcg/tricore/asm/macros.h
@@ -161,6 +161,21 @@ test_ ## num: \
insn DREG_CALC_RESULT, DREG_RS1, imm1, DREG_RS2, imm2; \
)
+#define TEST_D_DDII(insn, num, result, rs1, rs2, imm1, imm2) \
+ TEST_CASE(num, DREG_CALC_RESULT, result, \
+ LI(DREG_RS1, rs1); \
+ LI(DREG_RS2, rs2); \
+ rstv; \
+ insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2, imm1, imm2; \
+ )
+
+#define TEST_D_DIII(insn, num, result, rs1, imm1, imm2, imm3)\
+ TEST_CASE(num, DREG_CALC_RESULT, result, \
+ LI(DREG_RS1, rs1); \
+ rstv; \
+ insn DREG_CALC_RESULT, DREG_RS1, imm1, imm2, imm3; \
+ )
+
#define TEST_E_ED(insn, num, res_hi, res_lo, rs1_hi, rs1_lo, rs2) \
TEST_CASE_E(num, res_lo, res_hi, \
LI(EREG_RS1_LO, rs1_lo); \
diff --git a/tests/tcg/tricore/asm/test_insert.S b/tests/tcg/tricore/asm/test_insert.S
index d5fd2237e1..3978810121 100644
--- a/tests/tcg/tricore/asm/test_insert.S
+++ b/tests/tcg/tricore/asm/test_insert.S
@@ -6,4 +6,13 @@ _start:
# | | | | | | |
TEST_D_DIDI(insert, 1, 0x7fffffff, 0xffffffff, 0xa, 0x10, 0x8)
+# insn num result rs1 imm1 imm2 imm3
+# | | | | | | |
+ TEST_D_DIII(insert, 2, 0xd38fe370, 0xd38fe370, 0x4, 0x4 , 0x0)
+ TEST_D_DIII(insert, 3, 0xd38fe374, 0xd38fe370, 0x4, 0x0 , 0x4)
+
+# insn num result rs1 rs2 pos width
+# | | | | | | |
+ TEST_D_DDII(insert, 4, 0x03c1e53c, 0x03c1e53c, 0x45821385, 0x7 ,0x0)
+
TEST_PASSFAIL
--
2.41.0
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v2 09/11] target/tricore: Swap src and dst reg for RCRR_INSERT
2023-08-28 11:26 [PATCH v2 00/11] TriCore 1.6.2 insn and bugfixes Bastian Koppelmann
` (7 preceding siblings ...)
2023-08-28 11:26 ` [PATCH v2 08/11] target/tricore: Fix RCPW/RRPW_INSERT insns for width = 0 Bastian Koppelmann
@ 2023-08-28 11:26 ` Bastian Koppelmann
2023-08-28 18:17 ` Richard Henderson
2023-08-28 11:26 ` [PATCH v2 10/11] target/tricore: Replace cpu_*_code with translator_* Bastian Koppelmann
2023-08-28 11:26 ` [PATCH v2 11/11] target/tricore: Fix FTOUZ being ISA v1.3.1 up Bastian Koppelmann
10 siblings, 1 reply; 19+ messages in thread
From: Bastian Koppelmann @ 2023-08-28 11:26 UTC (permalink / raw)
To: qemu-devel; +Cc: anton.kochkov, richard.henderson, kbastian
Signed-off-by: Bastian Koppelmann <kbastian@mail.uni-paderborn.de>
---
target/tricore/translate.c | 8 ++++----
tests/tcg/tricore/asm/macros.h | 9 +++++++++
tests/tcg/tricore/asm/test_insert.S | 5 +++++
3 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/target/tricore/translate.c b/target/tricore/translate.c
index ee04434f26..403533c564 100644
--- a/target/tricore/translate.c
+++ b/target/tricore/translate.c
@@ -8227,12 +8227,12 @@ static void decode_32Bit_opc(DisasContext *ctx)
temp2 = tcg_temp_new(); /* width*/
temp3 = tcg_temp_new(); /* pos */
- CHECK_REG_PAIR(r3);
+ CHECK_REG_PAIR(r2);
- tcg_gen_andi_tl(temp2, cpu_gpr_d[r3+1], 0x1f);
- tcg_gen_andi_tl(temp3, cpu_gpr_d[r3], 0x1f);
+ tcg_gen_andi_tl(temp2, cpu_gpr_d[r2 + 1], 0x1f);
+ tcg_gen_andi_tl(temp3, cpu_gpr_d[r2], 0x1f);
- gen_insert(cpu_gpr_d[r2], cpu_gpr_d[r1], temp, temp2, temp3);
+ gen_insert(cpu_gpr_d[r3], cpu_gpr_d[r1], temp, temp2, temp3);
break;
/* RCRW Format */
case OPCM_32_RCRW_MASK_INSERT:
diff --git a/tests/tcg/tricore/asm/macros.h b/tests/tcg/tricore/asm/macros.h
index 51f6191ef2..17e696bef5 100644
--- a/tests/tcg/tricore/asm/macros.h
+++ b/tests/tcg/tricore/asm/macros.h
@@ -169,6 +169,15 @@ test_ ## num: \
insn DREG_CALC_RESULT, DREG_RS1, DREG_RS2, imm1, imm2; \
)
+#define TEST_D_DIE(insn, num, result, rs1, imm1, rs2_lo, rs2_hi)\
+ TEST_CASE(num, DREG_CALC_RESULT, result, \
+ LI(DREG_RS1, rs1); \
+ LI(EREG_RS2_LO, rs2_lo); \
+ LI(EREG_RS2_HI, rs2_hi); \
+ rstv; \
+ insn DREG_CALC_RESULT, DREG_RS1, imm1, EREG_RS2; \
+ )
+
#define TEST_D_DIII(insn, num, result, rs1, imm1, imm2, imm3)\
TEST_CASE(num, DREG_CALC_RESULT, result, \
LI(DREG_RS1, rs1); \
diff --git a/tests/tcg/tricore/asm/test_insert.S b/tests/tcg/tricore/asm/test_insert.S
index 3978810121..223d7ce796 100644
--- a/tests/tcg/tricore/asm/test_insert.S
+++ b/tests/tcg/tricore/asm/test_insert.S
@@ -15,4 +15,9 @@ _start:
# | | | | | | |
TEST_D_DDII(insert, 4, 0x03c1e53c, 0x03c1e53c, 0x45821385, 0x7 ,0x0)
+# insn num result rs1 imm1 rs2_h rs2_l
+# | | | | | | |
+ TEST_D_DIE(insert, 5, 0xe30c308d, 0xe30c308d ,0x3 , 0x00000000 ,0x00000000)
+ TEST_D_DIE(insert, 6, 0x669b0120, 0x669b2820 ,0x2 , 0x5530a1c7 ,0x3a2b0f67)
+
TEST_PASSFAIL
--
2.41.0
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v2 10/11] target/tricore: Replace cpu_*_code with translator_*
2023-08-28 11:26 [PATCH v2 00/11] TriCore 1.6.2 insn and bugfixes Bastian Koppelmann
` (8 preceding siblings ...)
2023-08-28 11:26 ` [PATCH v2 09/11] target/tricore: Swap src and dst reg for RCRR_INSERT Bastian Koppelmann
@ 2023-08-28 11:26 ` Bastian Koppelmann
2023-08-28 11:26 ` [PATCH v2 11/11] target/tricore: Fix FTOUZ being ISA v1.3.1 up Bastian Koppelmann
10 siblings, 0 replies; 19+ messages in thread
From: Bastian Koppelmann @ 2023-08-28 11:26 UTC (permalink / raw)
To: qemu-devel; +Cc: anton.kochkov, richard.henderson, kbastian
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Bastian Koppelmann <kbastian@mail.uni-paderborn.de>
---
target/tricore/translate.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/target/tricore/translate.c b/target/tricore/translate.c
index 403533c564..cc2030be14 100644
--- a/target/tricore/translate.c
+++ b/target/tricore/translate.c
@@ -8402,7 +8402,7 @@ static bool insn_crosses_page(CPUTriCoreState *env, DisasContext *ctx)
* 4 bytes from the page boundary, so we cross the page if the first
* 16 bits indicate that this is a 32 bit insn.
*/
- uint16_t insn = cpu_lduw_code(env, ctx->base.pc_next);
+ uint16_t insn = translator_lduw(env, &ctx->base, ctx->base.pc_next);
return !tricore_insn_is_16bit(insn);
}
@@ -8415,14 +8415,15 @@ static void tricore_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
uint16_t insn_lo;
bool is_16bit;
- insn_lo = cpu_lduw_code(env, ctx->base.pc_next);
+ insn_lo = translator_lduw(env, &ctx->base, ctx->base.pc_next);
is_16bit = tricore_insn_is_16bit(insn_lo);
if (is_16bit) {
ctx->opcode = insn_lo;
ctx->pc_succ_insn = ctx->base.pc_next + 2;
decode_16Bit_opc(ctx);
} else {
- uint32_t insn_hi = cpu_lduw_code(env, ctx->base.pc_next + 2);
+ uint32_t insn_hi = translator_lduw(env, &ctx->base,
+ ctx->base.pc_next + 2);
ctx->opcode = insn_hi << 16 | insn_lo;
ctx->pc_succ_insn = ctx->base.pc_next + 4;
decode_32Bit_opc(ctx);
--
2.41.0
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v2 11/11] target/tricore: Fix FTOUZ being ISA v1.3.1 up
2023-08-28 11:26 [PATCH v2 00/11] TriCore 1.6.2 insn and bugfixes Bastian Koppelmann
` (9 preceding siblings ...)
2023-08-28 11:26 ` [PATCH v2 10/11] target/tricore: Replace cpu_*_code with translator_* Bastian Koppelmann
@ 2023-08-28 11:26 ` Bastian Koppelmann
10 siblings, 0 replies; 19+ messages in thread
From: Bastian Koppelmann @ 2023-08-28 11:26 UTC (permalink / raw)
To: qemu-devel; +Cc: anton.kochkov, richard.henderson, kbastian
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Bastian Koppelmann <kbastian@mail.uni-paderborn.de>
---
target/tricore/translate.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/target/tricore/translate.c b/target/tricore/translate.c
index cc2030be14..9770839749 100644
--- a/target/tricore/translate.c
+++ b/target/tricore/translate.c
@@ -6294,7 +6294,11 @@ static void decode_rr_divide(DisasContext *ctx)
gen_helper_ftou(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1]);
break;
case OPC2_32_RR_FTOUZ:
- gen_helper_ftouz(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1]);
+ if (has_feature(ctx, TRICORE_FEATURE_131)) {
+ gen_helper_ftouz(cpu_gpr_d[r3], cpu_env, cpu_gpr_d[r1]);
+ } else {
+ generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC);
+ }
break;
case OPC2_32_RR_UPDFL:
gen_helper_updfl(cpu_env, cpu_gpr_d[r1]);
--
2.41.0
^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [PATCH v2 08/11] target/tricore: Fix RCPW/RRPW_INSERT insns for width = 0
2023-08-28 11:26 ` [PATCH v2 08/11] target/tricore: Fix RCPW/RRPW_INSERT insns for width = 0 Bastian Koppelmann
@ 2023-08-28 12:29 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 19+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-08-28 12:29 UTC (permalink / raw)
To: Bastian Koppelmann, qemu-devel; +Cc: anton.kochkov, richard.henderson
On 28/8/23 13:26, Bastian Koppelmann wrote:
> we would crash if width was 0 for these insns, as tcg_gen_deposit() is
> undefined for that case. For TriCore, width = 0 is a mov from the src reg
> to the dst reg, so we special case this here.
>
> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
> Signed-off-by: Bastian Koppelmann <kbastian@mail.uni-paderborn.de>
> ---
> target/tricore/translate.c | 10 ++++++++--
> tests/tcg/tricore/asm/macros.h | 15 +++++++++++++++
> tests/tcg/tricore/asm/test_insert.S | 9 +++++++++
> 3 files changed, 32 insertions(+), 2 deletions(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v2 02/11] target/tricore: Implement CRCN insn
2023-08-28 11:26 ` [PATCH v2 02/11] target/tricore: Implement CRCN insn Bastian Koppelmann
@ 2023-08-28 18:09 ` Richard Henderson
0 siblings, 0 replies; 19+ messages in thread
From: Richard Henderson @ 2023-08-28 18:09 UTC (permalink / raw)
To: Bastian Koppelmann, qemu-devel; +Cc: anton.kochkov
On 8/28/23 04:26, Bastian Koppelmann wrote:
> reported inhttps://gitlab.com/qemu-project/qemu/-/issues/1667
>
> Signed-off-by: Bastian Koppelmann<kbastian@mail.uni-paderborn.de>
> ---
> v1 -> v2:
> - Removed useless deposits in crc_div()
> - Replaced final deposit() with extract() in helper_crcn()
> - Add trap for CRCN insn if not feature_162
>
> target/tricore/helper.h | 1 +
> target/tricore/op_helper.c | 63 +++++++++++++++++++++++
> target/tricore/translate.c | 8 +++
> target/tricore/tricore-opcodes.h | 1 +
> tests/tcg/tricore/Makefile.softmmu-target | 1 +
> tests/tcg/tricore/asm/test_crcn.S | 9 ++++
> 6 files changed, 83 insertions(+)
> create mode 100644 tests/tcg/tricore/asm/test_crcn.S
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v2 04/11] target/tricore: Implement FTOU insn
2023-08-28 11:26 ` [PATCH v2 04/11] target/tricore: Implement FTOU insn Bastian Koppelmann
@ 2023-08-28 18:10 ` Richard Henderson
0 siblings, 0 replies; 19+ messages in thread
From: Richard Henderson @ 2023-08-28 18:10 UTC (permalink / raw)
To: Bastian Koppelmann, qemu-devel; +Cc: anton.kochkov
On 8/28/23 04:26, Bastian Koppelmann wrote:
> Signed-off-by: Bastian Koppelmann<kbastian@mail.uni-paderborn.de>
> ---
> v1 -> v2:
> - Remove special case for NAN input
> - Clarified, why we need arg < 0.0 special case
>
> target/tricore/fpu_helper.c | 32 +++++++++++++++++++++++
> target/tricore/helper.h | 1 +
> target/tricore/translate.c | 3 +++
> tests/tcg/tricore/Makefile.softmmu-target | 1 +
> tests/tcg/tricore/asm/test_ftou.S | 12 +++++++++
> 5 files changed, 49 insertions(+)
> create mode 100644 tests/tcg/tricore/asm/test_ftou.S
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v2 05/11] target/tricore: Clarify special case for FTOUZ insn
2023-08-28 11:26 ` [PATCH v2 05/11] target/tricore: Clarify special case for FTOUZ insn Bastian Koppelmann
@ 2023-08-28 18:11 ` Richard Henderson
0 siblings, 0 replies; 19+ messages in thread
From: Richard Henderson @ 2023-08-28 18:11 UTC (permalink / raw)
To: Bastian Koppelmann, qemu-devel; +Cc: anton.kochkov
On 8/28/23 04:26, Bastian Koppelmann wrote:
> this is not something other ISAs do, so clarify it with a comment.
>
> Signed-off-by: Bastian Koppelmann<kbastian@mail.uni-paderborn.de>
> ---
> target/tricore/fpu_helper.c | 5 +++++
> 1 file changed, 5 insertions(+)
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v2 06/11] target/tricore: Implement ftohp insn
2023-08-28 11:26 ` [PATCH v2 06/11] target/tricore: Implement ftohp insn Bastian Koppelmann
@ 2023-08-28 18:15 ` Richard Henderson
0 siblings, 0 replies; 19+ messages in thread
From: Richard Henderson @ 2023-08-28 18:15 UTC (permalink / raw)
To: Bastian Koppelmann, qemu-devel; +Cc: anton.kochkov
On 8/28/23 04:26, Bastian Koppelmann wrote:
> reported inhttps://gitlab.com/qemu-project/qemu/-/issues/1667
>
> Signed-off-by: Bastian Koppelmann<kbastian@mail.uni-paderborn.de>
> ---
> v1 -> v2:
> - Removed special case for f_arg being infinity
> - Clarified, why we need a special case for arg being NAN
>
> target/tricore/fpu_helper.c | 38 +++++++++++++++++++++++
> target/tricore/helper.c | 1 +
> target/tricore/helper.h | 1 +
> target/tricore/translate.c | 7 +++++
> target/tricore/tricore-opcodes.h | 1 +
> tests/tcg/tricore/Makefile.softmmu-target | 1 +
> tests/tcg/tricore/asm/test_ftohp.S | 14 +++++++++
> 7 files changed, 63 insertions(+)
> create mode 100644 tests/tcg/tricore/asm/test_ftohp.S
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v2 07/11] target/tricore: Implement hptof insn
2023-08-28 11:26 ` [PATCH v2 07/11] target/tricore: Implement hptof insn Bastian Koppelmann
@ 2023-08-28 18:17 ` Richard Henderson
0 siblings, 0 replies; 19+ messages in thread
From: Richard Henderson @ 2023-08-28 18:17 UTC (permalink / raw)
To: Bastian Koppelmann, qemu-devel; +Cc: anton.kochkov
On 8/28/23 04:26, Bastian Koppelmann wrote:
> Resolves:https://gitlab.com/qemu-project/qemu/-/issues/1667
> Signed-off-by: Bastian Koppelmann<kbastian@mail.uni-paderborn.de>
> ---
> v1 -> v2:
> - Removed special case for f_arg being infinity
> - Clarified, why we need a special case for arg being NAN
>
> target/tricore/fpu_helper.c | 36 +++++++++++++++++++++++
> target/tricore/helper.h | 1 +
> target/tricore/translate.c | 7 +++++
> target/tricore/tricore-opcodes.h | 1 +
> tests/tcg/tricore/Makefile.softmmu-target | 1 +
> tests/tcg/tricore/asm/test_hptof.S | 12 ++++++++
> 6 files changed, 58 insertions(+)
> create mode 100644 tests/tcg/tricore/asm/test_hptof.S
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v2 09/11] target/tricore: Swap src and dst reg for RCRR_INSERT
2023-08-28 11:26 ` [PATCH v2 09/11] target/tricore: Swap src and dst reg for RCRR_INSERT Bastian Koppelmann
@ 2023-08-28 18:17 ` Richard Henderson
0 siblings, 0 replies; 19+ messages in thread
From: Richard Henderson @ 2023-08-28 18:17 UTC (permalink / raw)
To: Bastian Koppelmann, qemu-devel; +Cc: anton.kochkov
On 8/28/23 04:26, Bastian Koppelmann wrote:
> Signed-off-by: Bastian Koppelmann<kbastian@mail.uni-paderborn.de>
> ---
> target/tricore/translate.c | 8 ++++----
> tests/tcg/tricore/asm/macros.h | 9 +++++++++
> tests/tcg/tricore/asm/test_insert.S | 5 +++++
> 3 files changed, 18 insertions(+), 4 deletions(-)
Acked-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply [flat|nested] 19+ messages in thread
end of thread, other threads:[~2023-08-28 18:18 UTC | newest]
Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-08-28 11:26 [PATCH v2 00/11] TriCore 1.6.2 insn and bugfixes Bastian Koppelmann
2023-08-28 11:26 ` [PATCH v2 01/11] tests/tcg/tricore: Bump cpu to tc37x Bastian Koppelmann
2023-08-28 11:26 ` [PATCH v2 02/11] target/tricore: Implement CRCN insn Bastian Koppelmann
2023-08-28 18:09 ` Richard Henderson
2023-08-28 11:26 ` [PATCH v2 03/11] target/tricore: Correctly handle FPU RM from PSW Bastian Koppelmann
2023-08-28 11:26 ` [PATCH v2 04/11] target/tricore: Implement FTOU insn Bastian Koppelmann
2023-08-28 18:10 ` Richard Henderson
2023-08-28 11:26 ` [PATCH v2 05/11] target/tricore: Clarify special case for FTOUZ insn Bastian Koppelmann
2023-08-28 18:11 ` Richard Henderson
2023-08-28 11:26 ` [PATCH v2 06/11] target/tricore: Implement ftohp insn Bastian Koppelmann
2023-08-28 18:15 ` Richard Henderson
2023-08-28 11:26 ` [PATCH v2 07/11] target/tricore: Implement hptof insn Bastian Koppelmann
2023-08-28 18:17 ` Richard Henderson
2023-08-28 11:26 ` [PATCH v2 08/11] target/tricore: Fix RCPW/RRPW_INSERT insns for width = 0 Bastian Koppelmann
2023-08-28 12:29 ` Philippe Mathieu-Daudé
2023-08-28 11:26 ` [PATCH v2 09/11] target/tricore: Swap src and dst reg for RCRR_INSERT Bastian Koppelmann
2023-08-28 18:17 ` Richard Henderson
2023-08-28 11:26 ` [PATCH v2 10/11] target/tricore: Replace cpu_*_code with translator_* Bastian Koppelmann
2023-08-28 11:26 ` [PATCH v2 11/11] target/tricore: Fix FTOUZ being ISA v1.3.1 up Bastian Koppelmann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).