Commit 7b786e1f3e for qemu.org
commit 7b786e1f3eb77e9bc13fffac7f7bb5be85a7e9c6
Author: James Hilliard <james.hilliard1@gmail.com>
Date: Tue Apr 21 17:10:18 2026 +0200
target/mips: drop Octeon zero-register fast paths
EXTS, CINS, and POP route their destination writes through
gen_store_gpr(), which already discards writes to $zero. Remove the
remaining translator fast paths for destination $zero so these Octeon
instructions follow the same shape as BADDU/DMUL and the generic MIPS
translator helpers.
Add a mips64/mips64el linux-user TCG smoke test for representative
Octeon population count instruction paths.
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: James Hilliard <james.hilliard1@gmail.com>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Message-Id: <20260520172313.23777-8-philmd@linaro.org>
diff --git a/target/mips/tcg/octeon_translate.c b/target/mips/tcg/octeon_translate.c
index 4dd7626835..b7531653e5 100644
--- a/target/mips/tcg/octeon_translate.c
+++ b/target/mips/tcg/octeon_translate.c
@@ -74,11 +74,6 @@ static bool trans_EXTS(DisasContext *ctx, arg_EXTS *a)
{
TCGv_i64 t0;
- if (a->rt == 0) {
- /* nop */
- return true;
- }
-
t0 = tcg_temp_new_i64();
gen_load_gpr(t0, a->rs);
tcg_gen_sextract_i64(t0, t0, a->p, a->lenm1 + 1);
@@ -90,11 +85,6 @@ static bool trans_CINS(DisasContext *ctx, arg_CINS *a)
{
TCGv_i64 t0;
- if (a->rt == 0) {
- /* nop */
- return true;
- }
-
t0 = tcg_temp_new_i64();
gen_load_gpr(t0, a->rs);
tcg_gen_deposit_z_i64(t0, t0, a->p, a->lenm1 + 1);
@@ -106,11 +96,6 @@ static bool trans_POP(DisasContext *ctx, arg_POP *a)
{
TCGv_i64 t0;
- if (a->rd == 0) {
- /* nop */
- return true;
- }
-
t0 = tcg_temp_new_i64();
gen_load_gpr(t0, a->rs);
if (!a->dw) {
diff --git a/tests/tcg/mips/user/isa/octeon/octeon-insns.c b/tests/tcg/mips/user/isa/octeon/octeon-insns.c
index b7610db812..f406726fc1 100644
--- a/tests/tcg/mips/user/isa/octeon/octeon-insns.c
+++ b/tests/tcg/mips/user/isa/octeon/octeon-insns.c
@@ -39,10 +39,26 @@ static uint64_t octeon_dmul(uint64_t rs, uint64_t rt)
return rd;
}
+static uint64_t octeon_dpop(uint64_t rs)
+{
+ uint64_t rd;
+
+ asm volatile(
+ "move $8, %[rs]\n\t"
+ ".word 0x7100502d\n\t" /* dpop $10, $8 */
+ "move %[rd], $10\n\t"
+ : [rd] "=r" (rd)
+ : [rs] "r" (rs)
+ : "$8", "$10");
+
+ return rd;
+}
+
int main(void)
{
assert(octeon_baddu(0x123, 0x0f0) == 0x13);
assert(octeon_dmul(0x12345678, 0x10) == 0x123456780);
+ assert(octeon_dpop(0xf0f0f0f0f0f0f0f0ULL) == 32);
return 0;
}